Pagini recente » Cod sursa (job #836514) | Cod sursa (job #2060976) | Cod sursa (job #501976) | Cod sursa (job #1773152) | Cod sursa (job #457589)
Cod sursa(job #457589)
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define maxn 1010
#define inf 99999999
int N, M, viz[maxn];
int viz1[maxn], viz2[maxn];
int C[maxn][maxn], F[maxn][maxn], TT[maxn];
vector<int> G[maxn], R;
vector<pair<int, int> > Muchii;
int BFS() {
int p;
queue<int> Q;
memset(viz, 0, sizeof(viz));
Q.push(1);
viz[1] = 1;
while(!Q.empty()) {
p = Q.front(); Q.pop();
for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
if(!viz[*it] && C[p][*it] > F[p][*it]) {
Q.push(*it);
viz[*it] = 1;
TT[*it] = p;
if(*it == N) return 1;
}
}
}
return 0;
}
void DFS1(int nod) {
viz1[nod] = 1;
for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
if(!viz1[*it] && C[nod][*it] > F[nod][*it] && C[*it][nod] > F[*it][nod])
DFS1(*it);
}
}
void DFS2(int nod) {
viz2[nod] = 1;
for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
if(!viz2[*it] && C[nod][*it] > F[nod][*it] && C[*it][nod] > F[*it][nod])
DFS2(*it);
}
}
int main() {
FILE *f1=fopen("critice.in", "r"), *f2=fopen("critice.out", "w");
int i, j, p, q;
fscanf(f1, "%d %d\n", &N, &M);
for(i=1; i<=M; i++) {
fscanf(f1, "%d %d %d\n", &p, &q, &j);
C[p][q] = C[q][p] = j;
G[p].push_back(q);
G[q].push_back(p);
Muchii.push_back(make_pair(p, q));
}
int ok = BFS();
while(ok) {
int fmin = inf;
for(i=N; i!=1; i=TT[i]) {
fmin = min(fmin, C[TT[i]][i] - F[TT[i]][i]);
}
for(i=N; i!=1; i=TT[i]) {
F[TT[i]][i] += fmin;
F[i][TT[i]] -= fmin;
}
ok = BFS();
}
DFS1(1); DFS2(N);
for(i=0; i<M; i++) {
p = Muchii[i].first; q = Muchii[i].second;
if(C[p][q] == F[p][q] && viz1[p] && viz2[q]) {
R.push_back(i+1);
}
else if(C[q][p] == F[q][p] && viz2[p] && viz1[q]) {
R.push_back(i+1);
}
}
fprintf(f2, "%d\n", R.size());
for(i=0; i<R.size(); i++) {
fprintf(f2, "%d\n", R[i]);
}
fclose(f1); fclose(f2);
return 0;
}