Pagini recente » Cod sursa (job #2152021) | Cod sursa (job #721914) | Cod sursa (job #1438025) | Cod sursa (job #1730631) | Cod sursa (job #3147992)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, x[1001][1001], y[1001][1001], p[1001], crit[1001][1001], M[10001][3];
vector<int> v[1001], MC;
int BFS()
{for(int i=1;i<=n;i++)
p[i]=0;
queue<int> q;
int a;
p[1]=1;
q.push(1);
while(q.empty()!=1)
{a=q.front();
vector<int>:: iterator I;
for(I=v[a].begin();I<v[a].end();I++)
if(p[*I]==0 && x[a][*I]>0)
{p[*I]=p[a]+1;
q.push(*I);
}
q.pop();
}
return p[n]!=0;
}
int DFS(int nod, int mini)
{if(nod==n)return mini;
vector<int>:: iterator I;
for(I=v[nod].begin();I<v[nod].end();I++)
if(x[nod][*I]>0 && p[nod]+1==p[*I])
{int a=DFS(*I, min(mini, x[nod][*I]));
if(a>0)
{x[nod][*I]-=a;
x[*I][nod]+=a;
return a;
}
}
return 0;
}
void DFS1(int nod)
{p[nod]=1;
vector<int>:: iterator I;
for(I=v[nod].begin();I<v[nod].end();I++)
if(p[*I]==0)
{if(x[nod][*I]==0 || x[*I][nod]==0)crit[nod][*I]++, crit[*I][nod]++;
else if(x[nod][*I]!=0)DFS1(*I);
}
}
int main()
{ int m, a, b, c;
fin>>n>>m;
for(int i=1;i<=m;i++)
{fin>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(a);
x[a][b]=x[b][c]=c;
y[a][b]=y[b][a]=i;
M[i][1]=a, M[i][2]=b;
}
while(BFS())
DFS(1, 2e9);
fill(p+1, p+1+n, 0);
DFS1(1);
fill(p+1, p+1+n, 0);
DFS1(n);
for(int i=1;i<=m;i++)
if(crit[M[i][1]][M[i][2]]>=2 || crit[M[i][2]][M[i][1]]>=2)
MC.push_back(i);
fout<<MC.size()<<"\n";
for(int i=0;i<MC.size();i++)
fout<<MC[i]<<"\n";
return 0;
}