Cod sursa(job #190606)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 23 mai 2008 17:09:45
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=1001;
vector<int> g[NMAX];
int a[10001][2],r[NMAX][NMAX],c[NMAX][NMAX];
int n,m,nr=0,v[NMAX],minim;
ifstream fin("critice.in");
ofstream fout("critice.out");
void citeste(){
     int i,j,k,w;
     fin>>n>>m;
     for (k=1;k<=m;++k){
         fin>>i>>j>>w;
         g[i].push_back(j);
         g[j].push_back(i);
         c[i][j]=c[j][i]=w;
         a[k][0]=i;
         a[k][1]=j;}
     }
int modul(int x){
    return x>0?x:-x;
}
bool bf(){
     bool gasit=false;
     int t[NMAX],w;
     vector<int>::iterator it;
     queue<int> q;
     memset(t,-1,sizeof(t));
     q.push(1);t[1]=0;
     while (!q.empty() && !gasit){
           w=q.front();
           q.pop();
           for (it=g[w].begin();it!=g[w].end();it++)
            if (r[w][*it]<c[w][*it])
            if (t[*it]==-1){
             t[*it]=w;
             q.push(*it);
             if (*it==n) gasit=true;
             }
           }
     if (!gasit) return false;
     minim=9999999;
     for (w=n;w!=1;w=t[w])
      if ((c[t[w]][w]-r[t[w]][w])<minim) minim=(c[t[w]][w]-r[t[w]][w]);
     for (w=n;w!=1;w=t[w]){
         r[t[w]][w]+=minim;
         r[w][t[w]]-=minim;}
     return true;
     
     }
void flux(){
     int f=0;
     bool w;
     while(1){
        w=bf();
        if (!w) break; 
        f+=minim;}
     //fout<<f<<'\n';
     }
bool viz1[NMAX],viz2[NMAX];
void bfs(int vf,bool viz[]){
     queue<int> q;
     int i;
     memset(viz,false,sizeof(viz));
     viz[vf]=true;
     q.push(vf);
     while (!q.empty()){
           i=q.front();
           q.pop();
           for (vector<int>::iterator it=g[i].begin();it!=g[i].end();it++)
            if (!viz[*it] && modul(r[i][*it])<c[i][*it]) {
                          viz[*it]=true;
                          q.push(*it);}
            }
     } 
void critice(){
     int i,j,k;
     bool w;
     bfs(1,viz1);
     bfs(n,viz2);
     for (k=1;k<=m;++k){
         i=a[k][0];
         j=a[k][1];
         if (viz1[i] && viz2[j] || viz1[j] && viz2[i])
          v[++nr]=k;
         } 
     fout<<nr<<'\n';
     for (i=1;i<=nr;++i) fout<<v[i]<<'\n';
     }
int main(){
    citeste();
    flux();
    critice();
    return 0;
}