Pagini recente » Cod sursa (job #1623537) | Cod sursa (job #5286) | Cod sursa (job #2883185) | Cod sursa (job #1240205) | Cod sursa (job #2395126)
#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 f("critice.in");
ofstream g("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()
{
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>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 (size_t 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);
}
g<<sol.size()<<"\n";
for (auto &it : sol)
g<<it<<"\n";
f.close();
g.close();
return 0;
}