Pagini recente » Cod sursa (job #1330611) | Cod sursa (job #2888584) | Cod sursa (job #2544773) | Cod sursa (job #2126341) | Cod sursa (job #2245108)
#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][DIMM],fl[DIMN][DIMM],d[DIMN],tt[DIMN],vf[DIMN],sol[DIMN];
vector <short> v[DIMN];
pair <short,short> nr[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,mini;
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[i]=make_pair(x,y);
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;
while (nod!=0){
mini=min(mini,c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod]);
vecin=nod;
nod=tt[nod];
}
nod=vf[i];
vecin=n;
while (nod!=0){
fl[nod][vecin]+=mini;
vecin=nod;
nod=tt[nod];
}
}
}
for (i=1;i<=m;i++){
x=nr[i].first;
y=nr[i].second;
if (fl[x][y]+fl[y][x]==c[x][y]){
c[x][y]++;
if (bfs(1))
sol[++s]=i;
c[x][y]--;
}
}
fprintf (fout,"%d\n",s);
for (i=1;i<=s;i++)
fprintf (fout,"%d\n",sol[i]);
return 0;
}