Pagini recente » Cod sursa (job #888151) | Cod sursa (job #2829358) | Cod sursa (job #169461) | Cod sursa (job #848462) | Cod sursa (job #1155436)
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#define maxn 1005
#define inf 999999999
using namespace std;
vector <pair<int,int> > V;
vector <int> G[maxn],sol;
queue <int> Q;
int tt[maxn],viz[maxn],C[maxn][maxn],F[maxn][maxn],flux,n,m,x,y,r,fmin,ver1[maxn],ver2[maxn],nr;
int bfs(){
Q.push(1);
int x,y;
for(int i=1;i<=n;++i)
viz[i]=0;
viz[1]=1;
while(!Q.empty()){
x=Q.front(); Q.pop();
if(n==x)
continue;
for(int i=0;i<G[x].size();++i){
y=G[x][i];
if(C[x][y]==F[x][y] || viz[y]==1)
continue;
viz[y]=1;
Q.push(y);
tt[y]=x;
}
}
return viz[n];
}
void ad1(int s){
ver1[s]=1;
for(int i=0;i<G[s].size();++i){
int nod=G[s][i];
if(!ver1[nod] && max(F[nod][s],F[s][nod])!=C[s][nod]){
ad1(nod);
}
}
}
void ad2(int s){
ver2[s]=1;
for(int i=0;i<G[s].size();++i){
int nod=G[s][i];
if(!ver2[nod] && max(F[nod][s],F[s][nod])!=C[s][nod]){
ad2(nod);
}
}
}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&r);
C[x][y]=C[y][x]=r;
V.push_back(make_pair(x,y));
G[x].push_back(y);
G[y].push_back(x);
}
flux=0;
while(bfs()){
for(int i=0;i<G[n].size();++i){
int nod=G[n][i];
if( viz[nod]==0 || C[nod][n]==F[nod][n])
continue;
tt[n]=nod;
fmin=inf;
for(int y=n;y!=1;y=tt[y]){
fmin=min(fmin,C[tt[y]][y]-F[tt[y]][y]);
}
if(!fmin)
continue;
for(int y=n;y!=1; y=tt[y]){
F[tt[y]][y]+=fmin;
F[y][tt[y]]-=fmin;
}
}
}
ad1(1);
ad2(n);
for(int i=0;i<V.size();++i){
if(ver1[V[i].first] && ver2[V[i].second] || ver1[V[i].second] && ver2[V[i].first])
sol.push_back(i+1);
}
printf("%d\n", sol.size());
for(int i=0;i<sol.size();++i)
printf("%d\n",sol[i]);
return 0;
}