Pagini recente » Cod sursa (job #2764371) | Cod sursa (job #742587) | Cod sursa (job #214544) | Cod sursa (job #2092679) | Cod sursa (job #2414921)
#include <bits/stdc++.h>
using namespace std;
#define nmax 1005
#define inf 0x3f3f3f3f
int n, m, i, x, y, cap;
int t[nmax], F[nmax][nmax], C[nmax][nmax], viz[nmax][3];
vector<pair<int, int> > e;
vector<int> G[nmax];
ifstream si("critice.in");
ofstream so("critice.out");
int bfs() {
queue<int> q;
memset(t, 0, sizeof(t));
q.push(1);
t[1]=1;
while(!q.empty()) {
int nod=q.front();
q.pop();
if(nod==n)
continue;
for(auto &it: G[nod])
if(!t[it]&&F[nod][it]<C[nod][it]) {
t[it]=nod;
q.push(it);
}
}
return (t[n]!=0);
}
void maxFlow() {
while(bfs()) {
for(auto &it: G[n]) {
if(!t[it]||C[it][n]==F[it][n])
continue;
t[n]=it;
int fm=inf;
for(int nod=n; nod!=1; nod=t[nod])
fm=min(fm, C[t[nod]][nod]-F[t[nod]][nod]);
if(!fm)
continue;
for(int nod=n; nod!=1; nod=t[nod]) {
F[t[nod]][nod]+=fm;
F[nod][t[nod]]-=fm;
}
}
}
}
void vizit(int S, int D, int sens) {
queue<int> q;
q.push(S);
viz[S][sens]=1;
while(!q.empty()) {
int nod=q.front();
q.pop();
if(nod==D)
continue;
for(auto &it: G[nod])
if(!viz[it][sens]&&F[nod][it]<C[nod][it]&&F[it][nod]<C[it][nod]) {
viz[it][sens]=1;
q.push(it);
}
}
}
int main() {
si>>n>>m;
for(i=1; i<=m; i++) {
si>>x>>y>>cap;
e.push_back(make_pair(x, y));
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=cap;
C[y][x]=cap;
}
maxFlow();
vizit(1, n, 0);
vizit(n, 1, 1);
vector<int> sol;
for(i=0; i<e.size(); i++) {
int a=e[i].first;
int b=e[i].second;
if(F[a][b]==C[a][b]&&viz[a][0]&&!viz[b][0]&&viz[b][1]&&!viz[a][1]) {
sol.push_back(i+1);
continue;
}
if(F[b][a]==C[b][a]&&viz[b][0]&&!viz[a][0]&&viz[a][1]&&!viz[b][1])
sol.push_back(i+1);
}
so<<sol.size()<<"\n";
for(auto &it: sol)
so<<it<<"\n";
return 0;
}