Pagini recente » Cod sursa (job #1521571) | Cod sursa (job #1614536) | Cod sursa (job #1092751) | Cod sursa (job #606010) | Cod sursa (job #1217802)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define maxN 1013
using namespace std;
void openIOFiles()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
}
vector <int> g[maxN];
int c[maxN][maxN];
int f[maxN][maxN];
int mem[maxN][maxN];
int T[maxN];
int sol[maxN];
int flux(0),S,D,i,n,x,y,m,aux,solutie(0),j;
inline int bfs()
{
int ok=0;
queue <int> q;
vector <int>::iterator it;
memset(T,0,sizeof(T));
T[S]=-1;
q.push(S);
while(!q.empty())
{
int nod=q.front();
for(it=g[nod].begin();it!=g[nod].end();++it)
if(T[*it]==0&&c[nod][*it]>f[nod][*it])
{
if(*it!=D){
T[*it]=nod;
q.push(*it);
}
else ok=1;
}
q.pop();
}
return ok;
}
inline void dinic()
{
vector <int>::iterator it;
int drum;
for(;bfs();)
for(it=g[D].begin();it!=g[D].end();++it)
if(T[*it]&&c[*it][D]>f[*it][D]){
T[D]=*it;
int minim=0x7fffffff;
for(int nod=D;nod!=S;nod=T[nod])
minim=min(minim,c[T[nod]][nod]-f[T[nod]][nod]);
flux+=minim;
for(int nod=D;nod!=S;nod=T[nod]){
f[T[nod]][nod]+=minim;
f[nod][T[nod]]-=minim;
}
}
}
int main()
{
openIOFiles();
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i) {
scanf("%d%d%d",&x,&y,&aux);
if (y==1) swap(x,y);
if (x==n) swap(x,y);
c[x][y]=aux;
mem[x][y]=i;
g[x].push_back(y);
g[y].push_back(x);
}
S=1; D=n;
dinic();
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
if (c[i][j]==f[i][j] && mem[i][j]>0) sol[mem[i][j]]=1;
for (i=1;i<=n;++i)
if (sol[i]>0) ++solutie;
printf("%d\n",solutie);
for (i=1;i<=n;++i)
if (sol[i]>0) printf("%d\n",i);
return 0;
}