Pagini recente » Cod sursa (job #401725) | Cod sursa (job #2559486) | Cod sursa (job #2540502) | Cod sursa (job #2121355) | Cod sursa (job #478283)
Cod sursa(job #478283)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int up[1002], viz[1002];
int c[1002][1002], f[1002][1002];
vector <int> v[1002];
inline int calc (int x, int y) {return c[x][y] - f[x][y];}
inline int minim (int a, int b) {return a < b ? a : b;}
int bfs ()
{
memset (up, -1, sizeof (up));
up[1] = 0;
int nod;
queue <int> q;
q.push (1);
while (!q.empty ())
{
nod = q.front ();
q.pop ();
for (vector <int> :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
if (up[*it] == -1 && calc (nod, *it) > 0)
{
up[*it] = nod;
if (*it == n)
return 1;
q.push (*it);
}
}
return 0;
}
void bfs2 (int start)
{
int nod;
queue <int> q;
q.push (start);
viz[start] += start;
while (!q.empty ())
{
nod = q.front ();
q.pop ();
for (vector <int> :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
if (viz[*it] == -1 && calc (nod, *it) > 0)
{
viz[*it] += start;
q.push (*it);
}
}
}
void flux ()
{
int nod, min;
while (bfs ())
{
nod = n;
min = calc (up[nod], nod);
while (up[nod])
{
min = minim (min, calc (up[nod], nod));
nod = up[nod];
}
nod = n;
while (up[nod])
{
f[up[nod]][nod] += min;
f[nod][up[nod]] -= min;
nod = up[nod];
}
}
}
void print ()
{
freopen ("critice.in", "r", stdin);
int i, x, y, cap, sol[10002] = {0};
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i ++)
{
scanf ("%d %d %d", &x, &y, &cap);
if (viz[x] + viz[y] == n - 1)
sol[++sol[0]] = i;
}
printf ("%d\n", sol[0]);
for (i = 1; i <= sol[0]; i ++)
printf ("%d\n", sol[i]);
}
int main ()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);
scanf ("%d %d", &n, &m);
int i, x, y, cap;
for (i = 1; i <= m; i ++)
{
scanf ("%d %d %d", &x, &y, &cap);
c[x][y] += cap;
c[y][x] += cap;
v[x].push_back (y);
v[y].push_back (x);
}
flux ();
memset (viz, -1, sizeof (viz));
bfs2 (1);
bfs2 (n);
print ();
return 0;
}