Pagini recente » Cod sursa (job #1582208) | Cod sursa (job #2570724) | Cod sursa (job #1016250) | Cod sursa (job #1654693) | Cod sursa (job #1495295)
#include <stdio.h>
#include <string.h>
#define MAXN 1000
#define MAXM 10000
int val[2*MAXM+1], next[2*MAXM+1], f[MAXN+1][MAXN+1], c[MAXN+1][MAXN+1], from[MAXN+1], q[MAXN+1], lista[MAXN+1], u[MAXN+1], a[MAXM], b[MAXM], ans[MAXM+1];
int k, n;
inline void adauga(int x, int y){
k++;
val[k]=y;
next[k]=lista[x];
lista[x]=k;
}
inline int bfs(){
int st, dr, p;
st=0;
dr=1;
q[0]=1;
memset(from, 0, sizeof from);
while(st<dr){
p=lista[q[st]];
while(p){
if((val[p]!=1)&&(from[val[p]]==0)&&(c[q[st]][val[p]]-f[q[st]][val[p]]>0)){
from[val[p]]=q[st];
q[dr++]=val[p];
}
p=next[p];
}
if(from[n]){
return 1;
}
st++;
}
return 0;
}
void dfs1(int x){
int p=lista[x];
u[x]=1;
while(p){
if((u[val[p]]!=1)&&(c[x][val[p]]>f[x][val[p]])&&(c[val[p]][x]>f[val[p]][x])){
dfs1(val[p]);
}
p=next[p];
}
}
void dfs2(int x){
int p=lista[x];
u[x]=2;
while(p){
if((u[val[p]]!=2)&&(c[x][val[p]]>f[x][val[p]])&&(c[val[p]][x]>f[val[p]][x])){
dfs2(val[p]);
}
p=next[p];
}
}
int main(){
int m, i, z, p, min;
FILE *fin, *fout;
fin=fopen("critice.in", "r");
fout=fopen("critice.out", "w");
fscanf(fin, "%d%d", &n, &m);
for(i=0; i<m; i++){
fscanf(fin, "%d%d%d", &a[i], &b[i], &z);
adauga(a[i], b[i]);
adauga(b[i], a[i]);
c[a[i]][b[i]]+=z;
c[b[i]][a[i]]+=z;
}
while(bfs()){
p=lista[n];
while(p){
if(from[val[p]]){
min=c[val[p]][n]-f[val[p]][n];
i=val[p];
while(from[i]){
if(min>c[from[i]][i]-f[from[i]][i]){
min=c[from[i]][i]-f[from[i]][i];
}
i=from[i];
}
f[val[p]][n]+=min;
f[n][val[p]]-=min;
i=val[p];
while(from[i]){
f[from[i]][i]+=min;
f[i][from[i]]-=min;
i=from[i];
}
}
p=next[p];
}
}
dfs1(1);
dfs2(n);
ans[0]=0;
for(i=0; i<m; i++){
if(((u[a[i]]==1)&&(u[b[i]]==2))||((u[a[i]]==2)&&(u[b[i]]==1))){
ans[++ans[0]]=i+1;
}
}
for(i=0; i<=ans[0]; i++){
fprintf(fout, "%d\n", ans[i]);
}
fclose(fin);
fclose(fout);
return 0;
}