Pagini recente » Cod sursa (job #2479705) | Cod sursa (job #252149) | Cod sursa (job #3163239) | Cod sursa (job #397850) | Cod sursa (job #602331)
Cod sursa(job #602331)
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 1005
#define MAXM 10005
int C[MAXN][MAXN], F[MAXN][MAXN], I[MAXN][MAXN], T[MAXN], use[MAXN], q, Q[MAXN];
int fd[MAXM], fu[MAXM], N, M;
vector<int> G[MAXN];
int bfs_flow(){
memset(use, 0, sizeof(use));
int i, n;
vector<int>::iterator ii;
q=1; Q[1]=1; use[1]=1;
for(i=1; i<=q; i++){
n=Q[i];
if(n == N)
continue;
for(ii=G[n].begin(); ii!=G[n].end(); ii++)
if(C[n][*ii]!=F[n][*ii] && !use[*ii]){
use[*ii]=1;
Q[++q]=*ii;
T[*ii]=n;
}
}
return use[N];
}
void bfs_node(int n, int *v){
memset(use, 0, sizeof(use));
q=1; Q[1]=n; use[n]=1;
int i, c;
vector<int>::iterator ii;
for(i=1; i<=q; i++){
c=Q[i];
for(ii=G[c].begin(); ii!=G[c].end(); ii++){
if(C[c][*ii]==F[c][*ii] || C[*ii][c]==F[*ii][c])
v[I[c][*ii]]=1;
else if(!use[*ii]){
use[*ii]=1;
Q[++q]=*ii;
}
}
}
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
int i, a, b, c, minf;
int R[MAXN], r;
vector<int>::iterator ii;
scanf("%d%d", &N, &M);
for(i=1; i<=M; i++){
scanf("%d%d%d", &a, &b, &c);
G[a].push_back(b);
G[b].push_back(a);
C[a][b]+=c;
C[b][a]+=c;
I[a][b]=I[b][a]=i;
}
while(bfs_flow())
for(ii=G[N].begin(); ii!=G[N].end(); ii++)
if(use[*ii] && C[*ii][N]!=F[*ii][N]){
T[N]=*ii;
minf=1<<30;
for(i=N; i!=1; i=T[i])
if(C[T[i]][i]-F[T[i]][i] < minf)
minf=C[T[i]][i]-F[T[i]][i];
if(minf)
for(i=N; i!=1; i=T[i]){
F[T[i]][i]+=minf;
F[i][T[i]]-=minf;
}
}
bfs_node(1, fd);
bfs_node(N, fu);
r=0;
for(i=1; i<=M; i++)
if(fd[i] && fu[i])
R[++r]=i;
printf("%d\n", r);
for(i=1; i<=r; i++)
printf("%d\n", R[i]);
return 0;
}