Pagini recente » Cod sursa (job #2667753) | Cod sursa (job #746959) | Cod sursa (job #852967) | Cod sursa (job #1727693) | Cod sursa (job #1213299)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define NMAX 1002
#define INF 200000000
int n,m,tnr;
int t[NMAX],f[NMAX][NMAX],cap[NMAX][NMAX],ind[NMAX][NMAX],q[NMAX],nr[NMAX],tata[NMAX],fv[10002];
vector<int>v[NMAX];
vector<int>sol;
bool drum()
{
int i,st=1,dr=0,nod=1,fiu;
memset(t,0,sizeof(t));
tnr=0;
t[nod]=nod;
q[++dr]=nod;
while(st<=dr)
{
nod=q[st];
++st;
for(i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if(f[nod][fiu]<cap[nod][fiu] && !t[fiu])
{
t[fiu]=nod;
if(fiu==n)
tata[++tnr]=nod,t[fiu]=0;
q[++dr]=fiu;
}
}
}
return tnr;
}
bool bfs(int nod,int c)
{
int i,st=1,dr=0,fiu;
memset(t,0,sizeof(t));
t[nod]=nod;
nr[nod]=c;
q[++dr]=nod;
while(st<=dr)
{
nod=q[st];
++st;
for(i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if(f[nod][fiu]*c<cap[nod][fiu] && !t[fiu])
{
t[fiu]=nod;
nr[fiu]=c;
if(fiu==n)
return 1;
q[++dr]=fiu;
}
}
}
return 0;
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
int i,j,x,y,c,minc;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back(y);
v[y].push_back(x);
ind[x][y]=ind[y][x]=i;
cap[x][y]=cap[y][x]=c;
}
while(drum())
{
for(j=1;j<=tnr;++j)
{
t[n]=tata[j];
minc=INF;
for(i=n;i!=1;i=t[i])
if(cap[t[i]][i]-f[t[i]][i]<minc)
minc=cap[t[i]][i]-f[t[i]][i];
for(i=n;i!=1;i=t[i])
{
f[t[i]][i]+=minc;
f[i][t[i]]-=minc;
}
}
}
bfs(1,1);
bfs(n,-1);
for(i=1;i<=n;++i)
for(j=0;j<v[i].size();++j)
{
x=ind[i][v[i][j]];
if(!fv[x])
{
fv[x]=1;
if(nr[i]*nr[v[i][j]]==-1)
sol.push_back(x);
}
}
printf("%d\n",sol.size());
for(i=0;i<sol.size();++i)
printf("%d\n",sol[i]);
return 0;
}