// OB会夏合宿2011 Day4 D : ハコの魔女 #include #include #include #include using namespace std; int cap[500][500]; int maximumFlow(int n, int s, int t, bool first = false){ int res = 0; int prev[500]; while(true) { queue qu; qu.push(s); memset(prev, -1, sizeof(prev)); prev[s] = s; while(!qu.empty()&&prev[t]<0){ int u = qu.front(); qu.pop(); for(int i=0;i0){ prev[i] = u; qu.push(i); } } } if(prev[t] < 0) return res; // 一度に流すフローの容量は1固定 for(int j=t;prev[j]!=j;j=prev[j]) cap[prev[j]][j]--, cap[j][prev[j]]++; res++; // 初回でなければ流れる量は高々1 if(!first) return res; } return 0; } int main(){ int N, E, Q; while(cin >> N >> E >> Q){ memset(cap, 0, sizeof(cap)); for(int i=0;itの枝が使用済みの時 if(cap[t][s] == 2){ cap[t][s] = 0; int tmp = maximumFlow(N, s, t); // s->tへの別のパスが存在しないとき if(tmp==0){ // 0->s へのフローを打ち消す maximumFlow(N, s, 0); // t->N-1へのフローを打ち消す maximumFlow(N, N-1, t); // フローの量は1減少 cur--; } } swap(s, t); } cap[s][t] = cap[t][s] = 0; } cout << cur << endl; } } }