Pagini recente » Rating Albu Mihai (WallFree) | Cod sursa (job #764578) | Cod sursa (job #2514445) | Cod sursa (job #2385740) | Cod sursa (job #1245700)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,c[1005][1005],fol[1005][1005],ant[1005],use[1005],res,inf=2147000000,sol=0,tx[10005],ty[10005];
int crit[10005],k;
vector <int> v[1005];
queue <int> q;
void BFS(int x)
{ int i,j,nod,nod2;
while(!q.empty()) q.pop();
memset(use,0,sizeof(use));
memset(ant,0,sizeof(ant));
q.push(1); use[1]=1;
while(!q.empty())
{ nod=q.front(); q.pop();
for(i=0;i<v[nod].size();i++)
if (!use[v[nod][i]] && c[nod][v[nod][i]]>fol[nod][v[nod][i]])
{ nod2=v[nod][i];
q.push(nod2);
use[nod2]=1;
ant[nod2]=nod;
}
}
}
int main()
{ int i,x,y,cap,n1,n2;
f>>n>>m;
for(i=1;i<=m;i++)
{ f>>x>>y>>cap;
c[x][y]=cap;
c[y][x]=cap;
v[x].push_back(y);
v[y].push_back(x);
tx[i]=x; ty[i]=y;
}
for(BFS(1);use[n]>0;BFS(1))
{
for(i=0;i<v[n].size();i++)
if (use[v[n][i]] && c[v[n][i]][n]>fol[v[n][i]][n])
{
x=v[n][i]; res=c[x][n]-fol[x][n];
while(ant[x])
{ n1=ant[x]; n2=x;
res=min(res,c[n1][n2]-fol[n1][n2]);
x=ant[x];
}
x=v[n][i]; fol[x][n]+=res;
while(ant[x])
{ n1=ant[x]; n2=x;
fol[n1][n2]+=res;
fol[n2][n1]+=res;
x=ant[x];
}
sol+=res;
}
}
for(i=1;i<=m;i++)
if (fol[tx[i]][ty[i]]==c[tx[i]][ty[i]])
{ c[tx[i]][ty[i]]+=1;
c[ty[i]][tx[i]]+=1;
BFS(1);
if (use[n]) {k++; crit[k]=i;}
c[tx[i]][ty[i]]-=1;
c[ty[i]][tx[i]]-=1;
}
g<<k<<"\n";
for(i=1;i<=k;i++)
g<<crit[i]<<"\n";
return 0;
}