Pagini recente » Cod sursa (job #490152) | Cod sursa (job #285082) | Cod sursa (job #2270659) | Cod sursa (job #821277) | Cod sursa (job #880915)
Cod sursa(job #880915)
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
#define MAXN 1100
#define MAXM 11000
#define INF 0x3f3f3f3f
#define FORIT(it, v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
int N, M, F[MAXN][MAXN], C[MAXN][MAXN], dad[MAXN], mark1[MAXN], mark2[MAXN], sol[MAXM];
vector<int> graph[MAXN];
vector< pair<int, int> > edges;
bool DFS() {
int coada[MAXN], poz = 1;
memset(dad, 0, sizeof(dad));
coada[0] = 1; coada[1] = 1; dad[1] = 1;
while (poz <= coada[0]) {
int nod = coada[poz];
++poz;
if (nod == N)
return 1;
FORIT(it, graph[nod])
if (!dad[*it] && C[nod][*it] - F[nod][*it]) {
coada[++coada[0]] = *it;
dad[*it] = nod;
}
}
return 0;
}
void markNodes(int nod, int mark[MAXN]) {
mark[nod] = 1;
FORIT(it, graph[nod])
if (!mark[*it] && C[nod][*it] > F[nod][*it])
markNodes(*it, mark);
}
int main () {
fin >> N >> M;
for (int i = 1; i <= M; ++i) {
int x, y, c;
fin >> x >> y >> c;
edges.push_back(make_pair(x, y));
graph[x].push_back(y);
graph[y].push_back(x);
C[x][y] = c;
C[y][x] = c;
}
while (DFS()) {
int minim = INF;
for (int i = N; i > 1; i = dad[i])
minim = min (minim, C[dad[i]][i] - F[dad[i]][i]);
for (int i = N; i > 1; i = dad[i]) {
F[dad[i]][i] += minim;
F[i][dad[i]] -= minim;
}
}
markNodes(1, mark1);
markNodes(N, mark2);
FORIT(it, edges) {
int nod1 = (*it).first;
int nod2 = (*it).second;
if (C[nod1][nod2] == F[nod1][nod2] && mark1[nod1] && mark2[nod2])
sol[++sol[0]] = it - edges.begin() + 1;
if (C[nod2][nod1] == F[nod2][nod1] && mark1[nod2] && mark2[nod1])
sol[++sol[0]] = it - edges.begin() + 1;
}
fout << sol[0] << "\n";
for (int i = 1; i <= sol[0]; ++i)
fout << sol[i] << "\n";
return 0;
}