Pagini recente » Cod sursa (job #1328130) | Cod sursa (job #2074257) | Monitorul de evaluare | Cod sursa (job #2403749) | Cod sursa (job #2245124)
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define INF 2000000000
#define DIMN 1001
#define DIMM 10001
using namespace std;
bitset <DIMN> f;
short c[DIMN][DIMN],nr[DIMN][DIMN],fl[DIMN][DIMN],d[DIMN],tt[DIMN],vf[DIMN],w[DIMM];
vector <short> v[DIMN];
pair <short,short> sol[DIMM];
int ok,n;
int i,p,u,nod,vecin;
int bfs (int s){
f.reset();
ok=0;
p=u=1;
d[p]=s;
f[s]=1;
while (p<=u){
nod=d[p];
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (f[vecin]==0 && fl[nod][vecin]+fl[vecin][nod]<c[nod][vecin]){
f[vecin]=1;
d[++u]=vecin;
tt[vecin]=nod;
}
if (vecin==n && fl[nod][vecin]+fl[vecin][nod]<c[nod][vecin])
vf[++ok]=nod;
}
p++;
}
return f[n];
}
int main()
{
FILE *fin=fopen ("critice.in","r");
FILE *fout=fopen ("critice.out","w");
int m,i,x,y,cap,s,nod,vecin,st,mini,ns,vs;
fscanf (fin,"%d%d",&n,&m);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d",&x,&y,&cap);
c[x][y]=c[y][x]=cap;
nr[x][y]=nr[y][x]=i;
v[x].push_back(y);
v[y].push_back(x);
}
s=0;
while (bfs(1)){
for (i=1;i<=ok;i++){
nod=vf[i];
vecin=n;
mini=INF;
st=1;
while (nod!=0){
if (mini>c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod]){
mini=c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod];
ns=nod;
vs=vecin;
st=1;
}
else if (mini==c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod])
st=0;
vecin=nod;
nod=tt[nod];
}
if (st)
sol[++s]=make_pair(ns,vs);
nod=vf[i];
vecin=n;
while (nod!=0){
fl[nod][vecin]+=mini;
vecin=nod;
nod=tt[nod];
}
}
}
int s2=0;
for (i=1;i<=s;i++){
c[sol[i].first][sol[i].second]++;
c[sol[i].second][sol[i].first]++;
if (bfs(1))
w[++s2]=nr[sol[i].first][sol[i].second];
c[sol[i].first][sol[i].second]--;
c[sol[i].second][sol[i].first]--;
}
s=s2;
sort (w+1,w+s+1);
fprintf (fout,"%d\n",s);
for (i=1;i<=s;i++)
fprintf (fout,"%d\n",w[i]);
return 0;
}