Exemple #1
0
int main(int argc, char* argv[])
{
	int total;
	scanf("%d", &total);
	while(total--) {
		init();
		push_flow();
	}
	return 0;
}
Exemple #2
0
 int max_flow(){
     bfs();
     //memset(d,0,sizeof(d));
     memset(cnt,0,sizeof(cnt));
     for (int i = 0; i < n; ++ i){
         if (d[i] != inf) cnt[d[i]]++;
     }
     int x = st, ans = 0;
     memset(cur, 0, sizeof(cur));
     for (int i = 0; i < n; ++ i){
         cur[i] = h[i];
     }
     while (d[st] < n){
         if (x == en){
             ans += push_flow();
             x = st;
         }   
         int ok = 0;
         for (int go = cur[x]; go; go = e[go]){
             if (c[go] && d[x] == d[b[go]] + 1){
                 ok = 1;
                 pre[b[go]] = go;
                 cur[x] = go;
                 x = b[go];
                 break;
             }
         }
         if (!ok){
             int tmp = n - 1;
             for (int go = h[x]; go; go = e[go]){
                 if (c[go]){
                     tmp = min(tmp, d[b[go]]);
                 }
             }
             if (-- cnt[d[x]] == 0) break;
             d[x] = tmp + 1;
             cnt[d[x]] ++;
             cur[x] = h[x];
             if (x != st) x = b[pre[x] ^ 1];
         }
     }
     return ans;
 }