Pagini recente » Cod sursa (job #316949) | Cod sursa (job #2464598) | Cod sursa (job #1619091) | Cod sursa (job #2181275) | Cod sursa (job #1535130)
#include <stdio.h>
#define MAXN 1000
#define MAXM 10000
#define INF 2000000000
int ult[MAXN], next[2 * MAXM], nod[2 * MAXM], cap[2 * MAXM], fol[2 * MAXM];
int q[MAXN], sc[MAXN], prev[MAXN];
char viz[MAXN], crit[MAXM];
inline int invs(int x){
if(x & 1)
return x - 1;
else
return x + 1;
}
inline char bfs(int n){
memset(viz, 0, sizeof viz);
int nd, st = 0, dr = 1, poz;
q[0] = 0;
viz[0] = 1;
while(!viz[n - 1] && st < dr){
nd = q[st];
st++;
poz = ult[nd];
while(poz != -1){
if(!viz[nod[poz]] && cap[poz] > fol[poz]){
viz[nod[poz]] = 1;
q[dr] = nod[poz];
prev[nod[poz]] = nd;
sc[nod[poz]] = poz;
dr++;
}
poz = next[poz];
}
}
return viz[n - 1];
}
int main(){
FILE *in = fopen("critice.in", "r");
int n, m, i, a, b, c, dr = 0;
fscanf(in, "%d%d", &n, &m);
for(i = 0; i < n; i++)
ult[i] = -1;
for(i = 0; i < m; i++){
fscanf(in, "%d%d%d", &a, &b, &c);
a--; b--;
cap[dr] = c;
nod[dr] = a;
next[dr] = ult[b];
ult[b] = dr;
dr++;
cap[dr] = c;
nod[dr] = b;
next[dr] = ult[a];
ult[a] = dr;
dr++;
}
fclose(in);
int p, nd, augm, ipoz, ip, nr = 0, poz;
while(bfs(n)){
poz = ult[n - 1];
while(poz != -1){
nd = nod[poz];
ipoz = invs(poz);
if(viz[nd] && cap[ipoz] - fol[ipoz] > 0){
augm = INF;
p = n - 1;
prev[n - 1] = nd;
sc[n - 1] = ipoz;
while(p != 0){
if(augm > cap[sc[p]] - fol[sc[p]])
augm = cap[sc[p]] - fol[sc[p]];
p = prev[p];
}
p = n - 1;
while(p != 0){
ip = invs(sc[p]);
fol[sc[p]] += augm;
fol[ip] -= augm;
p = prev[p];
}
}
poz = next[poz];
}
}
for(i = 0; i < m; i++){
cap[2 * i]++;
cap[2 * i + 1]++;
if(bfs(n)){
crit[i] = 1;
nr++;
}
cap[2 * i]--;
cap[2 * i + 1]--;
}
FILE *out = fopen("critice.out", "w");
fprintf(out, "%d\n", nr);
for(i = 0; i < m; i++)
if(crit[i])
fprintf(out, "%d\n", i + 1);
fclose(out);
return 0;
}