Pagini recente » Cod sursa (job #268130) | Cod sursa (job #1090204) | Cod sursa (job #1452481) | Cod sursa (job #217406) | Cod sursa (job #429174)
Cod sursa(job #429174)
#include <cstdio>
#include <vector>
#define nmax 1005
#define mmax 10005
#define INF 0x3f3f3f
#define pb push_back
#define VIT vector <int> :: iterator
using namespace std;
int F [nmax][nmax], C [nmax][nmax], c [nmax * nmax], tx [mmax], ty [mmax], dad [nmax];
int n, m, sol [mmax], nr;
vector <int> G [nmax];
bool viz [nmax], viz1 [nmax], viz2 [nmax];
void read ()
{
int x, y, z, i;
scanf ("%d%d\n", &n, &m);
for (i = 1; i <= m; i++)
{
scanf ("%d%d%d\n", &x, &y, &z);
G [x].pb (y);
G [y].pb (x);
C [x][y] = z;
C [y][x] = z;
tx [i] = x;
ty [i] = y;
}
}
inline bool bfs ()
{
int p, u, node, V;
memset (viz, 0, sizeof (viz));
p = u = 0;
c [p] = 1;
viz [1] = 1;
VIT it;
while (p <= u)
{
node = c [p++];
if (node == n) return viz [n];
for (it = G [node].begin (); it != G [node].end (); it++)
{
V = *it;
if (!viz [V] && F [node][V] < C [node][V])
{
viz [V] = 1;
dad [V] = node;
c [++u] = V;
}
}
}
return viz [n];
}
void solve ()
{
VIT it;
int flow, node;
for (; bfs (); )
for (it = G [n].begin (); it != G [n].end (); it++)
{
node = *it;
if (viz [node])
{
flow = INF;
dad [n] = node;
for (node = n; node != 1; node = dad [node])
if (flow > C [dad [node]][node] - F [dad [node]][node])
flow = C [dad [node]][node] - F [dad [node]][node];
if (flow)
for (node = n; node != 1; node = dad [node])
{
F [dad [node]][node] += flow;
F [node][dad [node]] -= flow;
}
}
}
}
void dfs1 (int node)
{
viz1 [node] = 1;
VIT it;
for (it = G [node].begin (); it != G [node].end (); it++)
if (!viz1 [*it] && (C [node][*it] - F [node][*it] > 0 || C [*it][node] - F [*it][node] > 0))
dfs1 (*it);
}
void dfsn (int node)
{
viz2 [node] = 1;
VIT it;
for (it = G [node].begin (); it != G [node].end (); it++)
if (!viz2 [*it] && (C [node][*it] - F [node][*it] > 0 || C [*it][node] - F [*it][node] > 0))
dfsn (*it);
}
void real_solve ()
{
int i;
for (i = 1; i <= m; i++)
if (viz1 [tx [i]] && viz2 [ty [i]])
if (C [tx [i]][ty [i]] - F [tx [i]][ty [i]] == 0)
sol [++nr] = i;
else if (viz1 [ty [i]] && viz2 [tx [i]])
if (C [ty [i]][tx [i]] - F [ty [i]][tx [i]] == 0)
sol [++nr] = i;
printf ("%d\n", nr);
for (i = 1; i <= nr; i++)
printf ("%d\n", i);
}
int main ()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);
read ();
solve ();
dfs1 (1);
dfsn (n);
real_solve ();
return 0;
}