Exemplo n.º 1
0
int main() {
  int n, m, s, t, kase = 0;
  while(scanf("%d%d%d%d", &n, &s, &t, &m) == 4 && n) {
    g.init(n);
    while(m--) {
      int u, v, c;
      scanf("%d%d%d", &u, &v, &c); u--; v--;
      g.AddEdge(u, v, c);
      g.AddEdge(v, u, c);
    }
    printf("Network %d\nThe bandwidth is %d.\n\n", ++kase, g.Maxflow(s-1, t-1));
  }
  return 0;
}
Exemplo n.º 2
0
int main()
{
	int N, M;
	scanf("%d %d", &N, &M);
	EdmondsKarp ek;
	ek.init(N + M + 2);
	int s = N + M;
	int t = s + 1;
	for (int i = 0; i < N; ++i)
	{
		ek.AddEdge(s, i, 1);
	}
	for (int i = 0; i < M; ++i)
	{
		ek.AddEdge(N + i, t, 1);
	}
	for (int i = 0; i < N; ++i)
	{
		int s;
		scanf("%d", &s);
		for (int j = 0; j < s; ++j)
		{
			int v;
			scanf("%d", &v);
			ek.AddEdge(i, N + v - 1, 1);
		}
	}
	printf("%d\n", ek.Maxflow(s, t));
	return 0;
}
Exemplo n.º 3
0
int main() {
  int T;
  cin >> T;
  while(T--) {
    names.clear();
    string s1, s2;
    cin >> n;
    for(int i = 0; i < n; i++) {
      cin >> s1;
      target[i] = ID(s1);
    }
    cin >> m;
    for(int i = 0; i < m; i++) {
      cin >> s1 >> s2;
      device[i] = ID(s2);
    }
    cin >> k;
    for(int i = 0; i < k; i++) {
      cin >> s1 >> s2;
      from[i] = ID(s1); to[i] = ID(s2);
    }
    
    int V = names.size();
    g.init(V+2);
    for(int i = 0; i < m; i++)
      g.AddEdge(V, device[i], 1); // 源点->设备
    for(int i = 0; i < n; i++)
      g.AddEdge(target[i], V+1, 1); // 插座->汇点
    for(int i = 0; i < k; i++)
      g.AddEdge(from[i], to[i], INF); // 插头->插头
    int r = g.Maxflow(V, V+1);
    cout << m-r << "\n";
    if(T) cout << "\n";
  }
  return 0;
}
Exemplo n.º 4
0
bool ok(int f) {
  EdmondsKarp mf;
  mf.init(2 * n + 2);
  int s = 2 * n, t = 2 * n + 1;
  for(int i = 0; i < n; i++) {
    if(v[i] > 0) {
      mf.addEdge(s, i << 1, v[i]);
      mf.addEdge(i << 1, (i << 1) | 1, v[i]);
      if(border[i]) {
	mf.addEdge(i << 1, t, f);
      } else {
	mf.addEdge(i << 1, t, 1);
      }
      for(int j = 0; j < n; j++) {
	if(mat[i][j] == 'Y' && v[j] > 0)
	  mf.addEdge((i << 1) | 1, j << 1, v[i]);
      }
    }
  }
  int flow = mf.maxFlow(s, t);
  return flow == vn - bn + bn * f;
}
Exemplo n.º 5
0
int main() {
  int n, m, u, v, c, b, d;
  while(scanf("%d", &n) == 1 && n) {
    g.init(2*n+2);
    // 拆点
    for(int i = 1; i <= n; i++) {
      scanf("%d", &c);
      g.AddEdge(i*2, i*2+1, c);
    }
    scanf("%d", &m);
    while(m--) {
      scanf("%d%d%d", &u, &v, &c);
      g.AddEdge(u*2+1, v*2, c);
    }
    scanf("%d%d", &b, &d);
    while(b--) { scanf("%d", &u); g.AddEdge(0, u*2, INF); }
    while(d--) { scanf("%d", &u); g.AddEdge(u*2+1, 1, INF); }
    printf("%d\n", g.Maxflow(0, 1));
  }
  return 0;
}
Exemplo n.º 6
0
int main() {
  int tc;
  scanf("%d", &tc);
  while(tc--) {
    memset(board, 0, sizeof board);
    scanf("%d %d", &m, &n);
    int p;
    scanf("%d", &p);
    for(int i = 0; i < p; i++) {
      int x, y;
      scanf("%d %d", &x, &y);
      board[x][y] = 1;
    }
    int w;
    scanf("%d", &w);
    for(int i = 0; i < w; i++) {
      int x, y;
      scanf("%d %d", &x, &y);
      board[x][y] = 2;
    }
    int M = 1;
    for(int i = 1; i <= m; i++) {
      int j = 1;
      while(j <= n) {
	while(j<=n && board[i][j] != 2)
	  node[i][j++][0] = M;
	M++;
	while(j<=n && board[i][j] == 2)
	  j++;
      }
    }
    int N = M+1;
    for(int j = 1; j <= n; j++) {
      int i = 1;
      while(i <= m) {
	while(i <= m && board[i][j] != 2)
	  node[i++][j][1] = N;
	N++;
	while(i <= m && board[i][j] == 2)
	  i++;
      }
    }
    N -= M;
    EdmondsKarp mf;
    mf.init(M+N+2);
    int s = 0;
    int t = M+N+1;
    for(int i = 1; i <= M; i++) {
      mf.addEdge(s, i, 1);
    }
    for(int i = M+1; i <= M+N; i++) {
      mf.addEdge(i, t, 1);
    }
    for(int i = 1; i <= m; i++) {
      for(int j = 1; j <= n; j++) {
	if(board[i][j] == 1)
	  mf.addEdge(node[i][j][0], node[i][j][1], 1);
      }
    }
    printf("%d\n", mf.maxFlow(0, M+N+1));
  }
  return 0;
}