Mai intai trebuie sa te autentifici.
Cod sursa(job #132068)
Utilizator | Data | 4 februarie 2008 23:11:24 | |
---|---|---|---|
Problema | Critice | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.17 kb |
#include <cstdio>
#include <deque>
using namespace std;
const int MAX_N = 1024;
const int INF = 700000;
int C[MAX_N][MAX_N], IC[MAX_N][MAX_N], prev[MAX_N], S[MAX_N * MAX_N], M, N;
int E[MAX_N * MAX_N][2];
bool U[MAX_N], P[MAX_N][MAX_N];
deque<int> L[MAX_N];
deque<int> Q;
bool breadthFirst(int src, int snk) {
if (src == snk)
return true;
int i, c, n;
for (i = 1; i <= N; ++ i) {
U[i] = false;
prev[i] = -1;
}
U[src] = true;
Q.clear();
Q.push_back(src);
while (Q.empty() == false) {
c = Q.front();
Q.pop_front();
for (i = 0; i < L[c].size(); ++ i) {
n = L[c][i];
if (U[n] == false && C[c][n] > 0) {
U[n] = true;
prev[n] = c;
Q.push_back(n);
if (n == snk)
return true;
}
}
}
return false;
}
int pathCapacity() {
bool ans = breadthFirst(1, N);
if (ans == false)
return 0;
int dif = -1, c;
for (c = N; prev[c] != -1; c = prev[c])
if (dif == -1 || C[prev[c]][c] < dif)
dif = C[prev[c]][c];
if (c != 1 || dif == -1)
return 0;
return dif;
}
int flowRoute() {
int dif = pathCapacity(), snk = N, c;
if (dif == 0)
return 0;
for (c = snk; prev[c] != -1; c = prev[c]) {
C[prev[c]][c] -= dif;
C[c][prev[c]] += dif;
}
return dif;
}
inline int maxFlow() {
int ans = 0, route = 0;
while (route = flowRoute())
ans += route;
return ans;
}
int main() {
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d", &N, &M);
int i, v1, v2, c;
for (i = 0; i < M; ++ i) {
scanf("%d %d %d", &v1, &v2, &c);
C[v1][v2] = C[v2][v1] = c;
L[v1].push_back(v2);
L[v2].push_back(v1);
E[i][0] = v1;
E[i][1] = v2;
IC[v1][v2] = IC[v2][v1] = c;
}
maxFlow();
int j;
for (i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j)
if (IC[i][j] - C[i][j] > 0)
C[j][i] = IC[i][j] - C[i][j];
int src = 1, snk = N, ns = 0;
for (i = 0; i < M; ++ i) {
v1 = E[i][0];
v2 = E[i][1];
if (C[v2][v1] == IC[v1][v2] && (breadthFirst(src, v1) && breadthFirst(v2, snk))) {
S[ns ++] = i + 1;
continue;
}
if (C[v1][v2] == IC[v2][v1] && (breadthFirst(src, v2) && breadthFirst(v1, snk)))
S[ns ++] = i + 1;
}
printf("%d\n", ns);
for (i = 0; i < ns; ++ i)
printf("%d\n", S[i]);
return 0;
}