Pagini recente » Cod sursa (job #273140) | Cod sursa (job #899600) | Cod sursa (job #432361) | Cod sursa (job #2734301) | Cod sursa (job #1964393)
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
queue<int> q;
vector<int> v[1010];
int n,cap[1010][1010],flow[1010][1010],v1[1010][1010],tata[1010],rez[10010];
char vaz[1010],vaz1[1010];
int bfs(int S,int D)
{
for(int i=1;i<=n;i++) vaz[i]=0;
vaz[S]=1;
q.push(S);
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<v[nod].size();i++)
{
int nod1=v[nod][i];
if(vaz[nod1]==1 or cap[nod][nod1]==flow[nod][nod1]) continue;
vaz[nod1]=1;
if(nod1!=D) q.push(nod1);
tata[nod1]=nod;
}
}
return vaz[D];
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
int m,x,y,c,l=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
cap[x][y]=c;
cap[y][x]=c;
v1[x][y]=i;v1[y][x]=i;
v[x].push_back(y);
v[y].push_back(x);
}
int S=1,D=n;
while(bfs(S,D))
{
for(int i=0;i<v[D].size();i++)
{
int nod=v[D][i];
if(vaz[nod]==0 or cap[nod][D]==flow[nod][D]) continue;
tata[D]=nod;
int s=1e9;
for(int a=D;a!=S;a=tata[a]) s=min(s,cap[tata[a]][a]-flow[tata[a]][a]);
for(int a=D;a!=S;a=tata[a])
{
flow[tata[a]][a]+=s;
flow[a][tata[a]]-=s;
}
}
}
vaz1[D]=1;
q.push(D);
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<v[nod].size();i++)
{
int nod1=v[nod][i];
if(vaz1[nod1]==1 or flow[nod1][nod]==cap[nod1][nod]) continue;
vaz1[nod1]=1;
q.push(nod1);
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<v[i].size();j++)
{
int nod=v[i][j];
if(cap[i][nod]==flow[i][nod] && vaz[i]==1 && vaz1[nod]==1) rez[++l]=v1[i][nod];
}
printf("%d\n",l);
sort(rez+1,rez+l+1);
for(int i=1;i<=l;i++)
printf("%d\n",rez[i]);
return 0;
}