Pagini recente » Cod sursa (job #87255) | Cod sursa (job #2036783) | Cod sursa (job #2082713) | Cod sursa (job #2523024) | Cod sursa (job #318541)
Cod sursa(job #318541)
#include <cstdio>
#include <cstring>
const int INF = 0x3f3f3f3f;
const int MAX_N = 1024;
int n, m, sol;
int c[MAX_N][MAX_N];
int f[MAX_N], up[MAX_N], q[MAX_N], s[MAX_N];
int solv[MAX_N], z;
struct muchie {
int x, y;
} mc[MAX_N];
template <class T> T min(T a, T b) { return (a < b) ? a : b; }
int bf()
{
memset(f, 0, sizeof(f));
memset(up, 0, sizeof(up));
memset(q, 0, sizeof(q));
f[1] = INF;
q[0] = 1;
int l, r;
for (l = r = 0; l <= r && f[n] == 0; ++l)
{
int nod = q[l];
for (int i = 1; i <= n && f[n] == 0; ++i)
if (c[nod][i] > 0 && f[i] == 0)
{
f[i] = min(f[nod], c[nod][i]);
up[i] = nod;
q[++r] = i;
}
}
if (!f[n]) return 0;
sol += f[n];
for (int i = n; i != 1; i = up[i])
{
c[up[i]][i] -= f[n];
c[i][up[i]] += f[n];
}
return 0;
}
void bfs1(int val, int st)
{
memset(q, 0, sizeof(q));
memset(f, 0, sizeof(f));
s[st] = val;
q[0] = st;
int l, r;
for (l = r = 0; l <= r; ++l)
{
int nod = q[l];
for (int i = 1; i <= n; ++i)
{
if (val == 1 && c[nod][i] && !f[i])
{
s[i] = val;
f[i] = 1;
q[++r] = i;
}
if (val == 2 && c[i][nod] && !f[i])
{
s[i] = val;
f[i] = 1;
q[++r] = i;
}
}
}
}
int main()
{
int x, y, z, i;
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d", &x, &y, &z);
mc[i].x = x;
mc[i].y = y;
c[x][y] = z;
c[y][x] = z;
}
int ch = 1;
while (ch) ch = bf();
bfs1(1, 1);
bfs1(2, n);
z = 0;
for (i = 1; i <= m; ++i)
{
int xx = mc[i].x, yy = mc[i].y;
if ((!c[xx][yy] && c[yy][xx] || c[xx][yy] && !c[yy][xx]) &&
s[xx] + s[yy] == 3) solv[++z] = i;
}
printf("%d\n", z);
for (i = 1; i <= z; ++i) printf("%d\n", solv[i]);
}