Pagini recente » Cod sursa (job #870593) | Cod sursa (job #466561) | Cod sursa (job #2688105) | Cod sursa (job #612342) | Cod sursa (job #2697728)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 1000
#define f first
#define s second
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m, cost[NMAX+10][NMAX+10], p[NMAX+10], viz[3][NMAX+10];
vector <pair <int, int> > edge;
vector <int> ans, nod[NMAX+10];
queue <int> Q;
int addFlow()
{ for(int i=1; i<=n; i++)
p[i] = 0;
while(!Q.empty())
Q.pop();
Q.push(1);
p[1] = 1;
while(!Q.empty())
{ int a = Q.front();
Q.pop();
for(int i=0; i<nod[a].size(); i++)
if(!p[nod[a][i]] && cost[a][nod[a][i]])
{ p[nod[a][i]] = a;
Q.push(nod[a][i]);
}
}
return p[n];
}
void isOK(int x, int t)
{ while(!Q.empty())
Q.pop();
Q.push(x);
viz[t][x] = 1;
while(!Q.empty())
{ int a = Q.front();
Q.pop();
for(int i=0; i<nod[a].size(); i++)
if(!viz[t][nod[a][i]] && cost[a][nod[a][i]] && cost[nod[a][i]][a])
{ viz[t][nod[a][i]] = 1;
Q.push(nod[a][i]);
}
}
}
int main()
{
fin >> n >> m;
for(int i=1; i<=m; i++)
{ int nod1, nod2, c;
fin >> nod1 >> nod2 >> c;
nod[nod1].push_back(nod2);
nod[nod2].push_back(nod1);
edge.push_back({nod1, nod2});
cost[nod1][nod2] = cost[nod2][nod1] = c;
}
while(addFlow())
{ for(int i=1; i<n; i++)
if(p[i] && cost[i][n])
{ int newFlow = cost[i][n], curr = i;
while(curr != 1)
{ newFlow = min(newFlow, cost[p[curr]][curr]);
curr = p[curr];
}
if(!newFlow) continue;
cost[i][n] -= newFlow;
cost[n][i] += newFlow;
curr = i;
while(curr != 1)
{ cost[p[curr]][curr] -= newFlow;
cost[curr][p[curr]] += newFlow;
curr = p[curr];
}
}
}
isOK(1, 0);
isOK(n, 1);
for(int i=0; i<m; i++)
{ pair <int, int> u = edge[i];
if((viz[0][u.f] && viz[1][u.s]) || (viz[0][u.s] && viz[1][u.f]))
ans.push_back(i + 1);
}
fout << ans.size() << '\n';
for(auto u : ans)
fout << u << '\n';
return 0;
}