Pagini recente » Cod sursa (job #1838097) | Cod sursa (job #3236009) | Cod sursa (job #1060467) | Cod sursa (job #2548195) | Cod sursa (job #2749439)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int nmax=1000, inf=(1<<30)-1, mmax=10000;
vector <int> g[nmax+1];
int f[nmax+1][nmax+1], t[nmax+1], c[mmax+1][2];
int v[nmax+1],u[nmax+1],vsol[nmax+1];
queue <int> q;
void dfs(int x, int *v){
v[x]=1;
for(int i=0;i<int(g[x].size());i++){
int xn=g[x][i];
if(v[xn]==0&&f[x][xn]>0){
dfs(xn, v);
}
}
}
int main(){
int n,m;
fin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,z;
fin>>x>>y>>z;
g[x].push_back(y);
g[y].push_back(x);
c[i][0]=x;
c[i][1]=y;
f[x][y]=z;
f[y][x]=z;
}
int ok=1;
while(ok==1){
for(int i=1;i<=n;i++){
t[i]=0;
}
q.push(1);
while(q.empty()==0){
int x=q.front();
q.pop();
for(int i=0;i<int(g[x].size());i++){
int xn=g[x][i];
if(f[x][xn]>0&&t[xn]==0){
t[xn]=x;
q.push(xn);
}
}
}
if(t[n]!=0){
ok=1;
for(int i=0;i<int(g[n].size());i++){
int p=g[n][i],mini=f[g[n][i]][n];
if(mini>0){
while(p!=1){
if(f[t[p]][p]<mini){
mini=f[t[p]][p];
}
p=t[p];
}
p=g[n][i];
if(mini>0){
while(p!=1){
f[t[p]][p]-=mini;
f[p][t[p]]+=mini;
p=t[p];
}
f[g[n][i]][n]-=mini;
f[n][g[n][i]]+=mini;
}
}
}
}else{
ok=0;
}
}
//fout<<sol<<"\n";
dfs(1,v);
dfs(n,u);
int sol=0;
for(int i=1;i<=m;i++){
int x=c[i][0], y=c[i][1];
if((u[x]==1&&v[y]==1)||(u[y]==1&&v[x]==1)){
if(f[x][y]==0||f[y][x]==0){
sol++;
vsol[sol]=i;
}
}
}
fout<<sol<<"\n";
for(int i=1;i<=sol;i++){
fout<<vsol[i]<<"\n";
}
return 0;
}