Pagini recente » Cod sursa (job #1701197) | Cod sursa (job #1414434) | Cod sursa (job #2850910) | Cod sursa (job #2774315) | Cod sursa (job #627051)
Cod sursa(job #627051)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 1010
#define MMAX 10010
#define INF (1<<20)
vector< pair<int, int> > edge;
vector<int> A[NMAX];
int F[NMAX][NMAX], C[NMAX][NMAX], from[NMAX], viz[NMAX][2], Q[NMAX];
int rez[MMAX];
int N, M, tail, head;
inline int min(int a, int b)
{
return (a<b)?a:b;
}
void read()
{
int x, y, i, cost;
scanf("%d %d", &N, &M);
for (i=1; i<=M; ++i) {
scanf("%d %d %d", &x, &y, &cost);
edge.push_back(make_pair(x, y));
A[x].push_back(y);
A[y].push_back(x);
C[x][y] = C[y][x] = cost;
}
}
int BFS()
{
int i, V;
head = tail = 0;
Q[head++] = 1;
while (tail < head) {
int node = Q[tail++];
if (node == N)
continue;
for (i=0; i<A[node].size(); ++i) {
V = A[node][i];
if (!from[V] && (C[node][V] - F[node][V]) > 0) {
from[V] = node;
Q[head++] = V;
}
}
}
return from[N];
}
void flux()
{
int i, j, V;
memset(from, 0, sizeof(from));
while (BFS()) {
for (i=0; i<A[N].size(); ++i) {
V = A[N][i];
if ((C[N][V] - F[N][V]) > 0 && from[V]) {
from[N] = V;
int flux = INF;
for (j=N; j > 1; j=from[j])
flux = min(flux, C[from[j]][j] - F[from[j]][j]);
for (j=N; j > 1; j=from[j]) {
F[from[j]][j] += flux;
F[j][from[j]] -= flux;
}
}
}
memset(from, 0, sizeof(from));
}
}
void bfs(int start, int end, int st)
{
tail = head = 0;
viz[start][st] = 1;
Q[head++] = start;
while (tail < head) {
int node = Q[tail++];
if (node == end)
break;
vector <int>::iterator it;
for (it = A[node].begin(); it != A[node].end(); ++it) {
if (!viz[*it][st]) {
if (F[*it][node] < C[*it][node] && F[node][*it] < C[node][*it]) {
viz[*it][st] = 1;
Q[head++] = *it;
}
}
}
}
}
int main()
{
int i, size = 0;
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
read();
flux();
bfs(1, N, 0);
bfs(N, 1, 1);
for (i=0; i<M; ++i) {
int x = edge[i].first;
int y = edge[i].second;
if (F[x][y] == C[x][y]) {
if ((viz[x][0] && !viz[y][0]) && (!viz[x][1] && viz[y][1])) {
rez[++size] = i+1;
continue;
}
}
if (F[y][x] == C[y][x])
if ((!viz[x][0] && viz[y][0]) && (viz[x][1] && !viz[y][1]))
rez[++size] = i+1;
}
printf("%d\n", size);
for (i=1; i<=size; ++i)
printf("%d\n", rez[i]);
return 0;
}