Pagini recente » Cod sursa (job #2280590) | Cod sursa (job #1695431) | Cod sursa (job #2950467) | Cod sursa (job #2513764) | Cod sursa (job #1947083)
#include <fstream>
#include <queue>
#include <cstring>
#include <iostream>
#include <vector>
#define INF 1000000000
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m,j,z,x,y,c,q,t[1005],fmn,ct,flow,s1[10005],p[1005][1005],flux;
int d[1005][1005],f[1005][1005],dmax[1005];
vector <int> v[1005];
bool viz[1005],viz2[1005];
queue <int>C;
void BFS()
{int i;
memset(viz,0,sizeof(viz));
C.push(1);
viz[1]=1;
while(!C.empty())
{c=C.front();
C.pop();
if(c==n)continue;
for(i=0;i<v[c].size();i++)
{q=v[c][i];
if(viz[q]==0&&d[c][q]!=f[c][q])
{viz[q]=1;
C.push(q);
t[q]=c;
}
}
}
}
void BFS1()
{int i;
memset(viz,0,sizeof(viz));
C.push(1);
viz[1]=1;
while(!C.empty())
{c=C.front();
C.pop();
if(c==n)continue;
for(i=0;i<v[c].size();i++)
{q=v[c][i];
flux=f[c][q];
if(flux<0)flux=flux*(-1);
if(viz[q]==0&&d[c][q]!=flux)
{viz[q]=1;
C.push(q);
}
}
}
}
void BFS2()
{int i;
memset(viz2,0,sizeof(viz));
C.push(n);
viz2[n]=1;
while(!C.empty())
{c=C.front();
C.pop();
if(c==1)continue;
for(i=0;i<v[c].size();i++)
{q=v[c][i];
flux=f[c][q];
if(flux<0)flux=flux*(-1);
if(viz2[q]==0&&d[c][q]!=flux)
{viz2[q]=1;
C.push(q);
}
}
}
}
int main()
{int i;
fin>>n>>m;
for(i=1;i<=m;i++)
{fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
d[x][y]=z;
d[y][x]=z;
dmax[x]+=z;
dmax[y]+=z;
p[x][y]=i;
p[y][x]=i;
}
BFS();
while(viz[n]==1)
{for(i=0;i<v[n].size();i++)
{fmn=INF;
if(viz[v[n][i]]==1&&d[v[n][i]][n]!=f[v[n][i]][n])
{t[n]=v[n][i];
q=n;
while(q!=1)
{fmn=min(fmn,d[t[q]][q]-f[t[q]][q]);
q=t[q];
}
q=n;
while(q!=1)
{f[t[q]][q]+=fmn;
f[q][t[q]]-=fmn;
q=t[q];
}
}
if(fmn!=INF)flow+=fmn;
}
BFS();
}
BFS1();
BFS2();
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
{if(d[i][j]==f[i][j]&&d[i][j]!=0)
{if((viz[i]==1&&viz2[j]==1&&viz[j]==0&&viz2[i]==0)||(viz[j]==1&&viz2[i]==1&&viz[i]==0&&viz2[j]==0)){ct++;s1[ct]=p[i][j];}
}
}
}
fout<<ct<<"\n";
for(i=1;i<=ct;i++)
fout<<s1[i]<<"\n";
}