Pagini recente » Cod sursa (job #1042831) | Cod sursa (job #2189257) | Cod sursa (job #1591900) | Cod sursa (job #1062141) | Cod sursa (job #1829534)
#include <bits/stdc++.h>
#define Nmax 1001
#define inf 0x7fffffff
using namespace std;
FILE *fin = freopen("critice.in", "r", stdin);
FILE *fout = freopen("critice.out", "w", stdout);
int n, m;
int S, D, ans[Nmax * Nmax];
int r[Nmax][Nmax], mat[Nmax][Nmax];
int deUnde[Nmax];
bool vis[2][Nmax];
queue < int > Q;
void read()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
r[x][y] = z;
mat[x][y] = mat[y][x] = i;
}
S = 1;
D = n;
}
void BFS(int S, int D)
{
int i;
memset(deUnde, 0, sizeof(deUnde));
Q.push(S);
deUnde[S] = S;
deUnde[D] = D;
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (i = 1; i < n; ++ i)
if (r[x][i] > 0 && deUnde[i] == 0)
{
deUnde[i] = x;
Q.push(i);
}
}
}
void dfs(int x, bool y)
{
for (int i = 1; i <= n; ++ i)
if ((y == 0 && r[x][i] > 0 && !vis[y][i]) || (y == 1 && r[i][x] > 0 && !vis[y][i]))
{
vis[y][i] = 1;
dfs(i, y);
}
}
void solve()
{
//ans = 0;
bool continua = true;
while (continua)
{
BFS(S, D);
continua = false;
for(int u = 1; u < n; u++)
if (r[u][D] > 0 && deUnde[u] != 0)
{
continua = true;
deUnde[D] = u;
int nod = D, cap = inf;
while (nod != S)
{
cap = min(cap, r[deUnde[nod]][nod]);
nod = deUnde[nod];
}
nod = D;
//ans += cap;
while (nod != S)
{
r[deUnde[nod]][nod] -= cap;
r[nod][deUnde[nod]] += cap;
nod = deUnde[nod];
}
}
}
}
void write()
{
vis[0][1] = 1;
dfs(1, 0);
vis[1][n] = 1;
dfs(n, 1);
for (int i = 1; i < n; ++ i)
for (int j = i + 1; j <= n; ++ j)
if (!r[i][j] && mat[i][j] && ((vis[0][i] && vis[1][j]) || (vis[0][j] && vis[1][i])))
ans[++ ans[0]] = mat[i][j];
printf("%d\n", ans[0]);
for (int i = 1; i <= ans[0]; ++ i)
printf("%d\n", ans[i]);
}
int main()
{
read();
solve();
write();
return 0;
}