Cod sursa(job #457589)

Utilizator vladiiIonescu Vlad vladii Data 20 mai 2010 11:20:30
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#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;
}