Pagini recente » Cod sursa (job #3145398) | Cod sursa (job #3235784) | Cod sursa (job #203186) | Cod sursa (job #2139857) | Cod sursa (job #1383955)
//#include <iostream>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <limits>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
#define nmax 1010
#define mod 1000007
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define inf numeric_limits<int>::max()
#define forv(v,it) for (vector<int>::iterator it=v.begin();it!=v.end();it++)
int n,m,x,y,z,c[nmax][nmax],f[nmax][nmax],viz[nmax],t[nmax],q[10*nmax],e[nmax][nmax],flmin;
int c2[nmax][nmax],f2[nmax][nmax],viz2[nmax],t2[nmax],q2[10*nmax];
vector<int> g[nmax],p,r;
int bfs()
{
int i,j,nod,vecin;
for (i=1;i<=n;i++)
viz[i]=0;
q[0]=q[1]=1;
for (i=1;i<=q[0];i++)
{
nod=q[i];
if (nod==n)
continue;
forv(g[nod],it)
{
vecin=*it;
if (c[nod][vecin]==f[nod][vecin] || viz[vecin])
continue;
viz[vecin]=1;
t[vecin]=nod;
q[++q[0]]=vecin;
}
}
return viz[n];
}
int bfs2()
{
int i,j,nod,vecin;
for (i=1;i<=n;i++)
viz2[i]=0;
q2[0]=q2[1]=n;
for (i=1;i<=q2[0];i++)
{
nod=q2[i];
if (nod==1)
continue;
forv(g[nod],it)
{
vecin=*it;
if (c2[nod][vecin]==f2[nod][vecin] || viz2[vecin])
continue;
viz2[vecin]=1;
t2[vecin]=nod;
q2[++q2[0]]=vecin;
}
}
return viz2[1];
}
int main()
{
int i,j,nod,vecin;
cin>>n>>m;
for (i=1;i<=m;i++)
{
cin>>x>>y>>z;
g[x].pb(y);
g[y].pb(x);
c[x][y]=z;
c[y][x]=z;
c2[x][y]=z;
c2[y][x]=z;
e[x][y]=i;
e[y][x]=i;
}
while (bfs())
{
forv(g[n],it)
{
vecin=*it;
if (c[vecin][n]==f[vecin][n])
{
p.pb(e[vecin][n]);
continue;
}
if (!viz[vecin])
continue;
t[n]=vecin;
flmin=inf;
for (nod=n;nod!=1;nod=t[nod])
{
if (flmin>c[t[nod]][nod]-f[t[nod]][nod])
flmin=c[t[nod]][nod]-f[t[nod]][nod];
if (c[t[nod]][nod]==f[t[nod]][nod])
p.pb(e[t[nod]][nod]);
}
if (!flmin)
continue;
for (nod=n;nod!=1;nod=t[nod])
{
f[t[nod]][nod]+=flmin;
f[nod][t[nod]]-=flmin;
}
}
}
while (bfs2())
{
forv(g[1],it)
{
vecin=*it;
if (c2[vecin][1]==f2[vecin][1])
{
r.pb(e[vecin][1]);
continue;
}
if (!viz2[vecin])
continue;
t2[n]=vecin;
flmin=inf;
for (nod=1;nod!=n;nod=t2[nod])
{
if (flmin>c2[t2[nod]][nod]-f2[t2[nod]][nod])
flmin=c2[t2[nod]][nod]-f2[t2[nod]][nod];
if (c2[t2[nod]][nod]==f2[t2[nod]][nod])
r.pb(e[t2[nod]][nod]);
}
if (!flmin)
continue;
for (nod=1;nod!=n;nod=t2[nod])
{
f2[t2[nod]][nod]+=flmin;
f2[nod][t2[nod]]-=flmin;
}
}
}
forv(r,it)
p.pb(*it);
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
cout<<p.size()<<'\n';
forv(p,it)
cout<<*it<<'\n';
}