Pagini recente » Cod sursa (job #1858230) | Cod sursa (job #2126318) | Monitorul de evaluare | Cod sursa (job #667860) | Cod sursa (job #2245255)
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define INF 2000000000
#define DIMN 1010
#define DIMM 10010
using namespace std;
bitset <DIMN> f;
int c[DIMN][DIMN],fl[DIMN][DIMN],d[DIMN],tt[DIMN],vf[DIMN],sol[DIMM];
vector <int> v[DIMN],w[DIMN];
pair <int,int> nr[DIMM];
int ok,n;
int bfs (int s){
int i,p,u,nod,vecin;
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 bfs2 (int s){
int i,p,u,nod,vecin;
f.reset();
p=u=1;
d[p]=s;
f[s]=1;
while (p<=u){
nod=d[p];
for (i=0;i<w[nod].size();i++){
vecin=w[nod][i];
if (f[vecin]==0){
f[vecin]=1;
d[++u]=vecin;
}
if (vecin==n)
return 1;
}
p++;
}
return 0;
}
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]){
w[x].push_back(y);
w[y].push_back(x);
}
}
for (i=1;i<=m;i++){
x=nr[i].first;
y=nr[i].second;
if (fl[x][y]+fl[y][x]<c[x][y])
continue;
c[x][y]++;
c[y][x]++;
w[x].push_back(y);
w[y].push_back(x);
if (bfs2(1))
sol[++s]=i;
w[x].pop_back();
w[y].pop_back();
c[x][y]--;
c[y][x]--;
}
fprintf (fout,"%d\n",s);
for (i=1;i<=s;i++)
fprintf (fout,"%d\n",sol[i]);
return 0;
}