Cod sursa(job #2474498)
Utilizator | Data | 15 octombrie 2019 12:33:52 | |
---|---|---|---|
Problema | Critice | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 3.29 kb |
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 1000 + 7;
int n, m;
vector <int> g[N];
int cap[N][N], level[N];
int id[N][N];
bool u[N];
int par[N];
bool pump_flow()
{
for (int i = 1; i <= n; i++)
u[i] = 0;
u[1] = 1;
queue <int> q;
q.push(1);
while (!q.empty())
{
int a = q.front();
q.pop();
for (auto &b : g[a])
if (u[b] == 0 && cap[a][b])
{
par[b] = a;
u[b] = 1;
q.push(b);
}
}
return u[n];
}
int get_flow()
{
int flow = 0;
while (pump_flow())
for (auto &go : g[n])
if (cap[go][n])
{
int mn = cap[go][n], cur = go;
while (cur != 1)
{
int p = par[cur];
mn = min(mn, cap[p][cur]);
cur = p;
}
if (mn)
{
flow += mn;
cap[go][n] -= mn;
cur = go;
while (cur != 1)
{
int p = par[cur];
cap[p][cur] -= mn;
cap[cur][p] += mn;
cur = p;
}
}
}
return flow;
}
bool fi[N];
bool sc[N];
void send_fi(int a)
{
fi[a] = 1;
for (auto &b : g[a])
if (fi[b] == 0 && cap[a][b])
send_fi(b);
}
bool send_sc(int a)
{
sc[a] = 1;
for (auto &b : g[a])
if (sc[b] == 0 && cap[b][a])
send_sc(b);
}
int main()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
id[x][y] = id[y][x] = i;
cap[x][y] += c;
cap[y][x] += c;
g[x].push_back(y);
g[y].push_back(x);
}
int flow = get_flow();
send_fi(1);
send_sc(n);
vector <int> sol;
for (int i = 1; i <= n; i++)
for (auto j : g[i])
if (cap[i][j] == 0 && fi[i] && sc[j])
sol.push_back(id[i][j]);
sort(sol.begin(), sol.end());
cout << (int) sol.size() << "\n";
for (auto &i : sol)
cout << i << "\n";
return 0;
}