Pagini recente » Cod sursa (job #668171) | Cod sursa (job #531680) | Cod sursa (job #1472308) | Cod sursa (job #1070512) | Cod sursa (job #1945961)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define N 1001
#define inf 1<<29
using namespace std;
int c[N][N],t[N],ind[N][N],n,flow;
bool viz[N],viz1[N*10];
vector <int> G[N],sol;
vector <int>::iterator it;
void Read(){
int m,x,y,i;
freopen("critice.in","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i){
scanf("%d%d",&x,&y);
scanf("%d",&c[x][y]);
c[y][x]=c[x][y];
ind[x][y]=ind[y][x]=i;
G[x].push_back(y);
G[y].push_back(x);
}
}
inline int Bfs(){
queue <int> Q;
int ok=0,node;
memset(t,0,sizeof(t));
t[1]=-1;Q.push(1);
while (!Q.empty()){
node=Q.front();Q.pop();
for (it=G[node].begin();it!=G[node].end();++it)
if (!t[*it] && c[node][*it]>0)
if (*it!=n) {
Q.push(*it);
t[*it]=node;
}
else ok=1;
}
return ok;
}
void Dinic(){
int node,mini;
for (int drum=Bfs();drum;drum=Bfs())
for (it=G[n].begin();it!=G[n].end();++it)
if (t[*it] && c[*it][n]>0){
t[n]=*it;mini=inf;node=n;
while (node!=1) {
mini=min(mini,c[t[node]][node]);
node=t[node];
}
flow+=mini;node=n;
while (node!=1) {
c[t[node]][node]-=mini;
c[node][t[node]]+=mini;
node=t[node];
}
}
}
void Bf(int sens){
int i,node;
queue <int> Q;
memset(viz,0,sizeof(viz));
if (sens) {Q.push(1);viz[1]=1;}
else {Q.push(n);viz[n]=n;}
while(!Q.empty()){
node=Q.front();Q.pop();
for (it=G[node].begin();it!=G[node].end();++it)
if (c[*it][node]&c[node][*it]) if (!viz[*it]) {
viz[*it]=1;
Q.push(*it);
}
else continue;
else if (sens) if (!viz1[ind[*it][node]]) viz1[ind[*it][node]]=1;
else continue;
else if (viz1[ind[*it][node]]) sol.push_back(ind[*it][node]);
}
}
void Write(){
freopen("critice.out","w",stdout);
printf("%d\n",sol.size());
for (it=sol.begin();it!=sol.end();++it)
printf("%d\n",*it);
}
int main()
{
Read();
Dinic();
Bf(1);
Bf(0);
Write();
return 0;
}