Cod sursa(job #190580)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 23 mai 2008 16:05:09
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 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];
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);
         r[i][j]=r[j][i]=w;
         a[k][0]=i;
         a[k][1]=j;}
     }
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]>0)
            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 (r[t[w]][w]<minim) minim=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 viz[NMAX];
void bfs(int vf){
     queue<int> q;
     int i;
     memset(viz,false,sizeof(viz));
     viz[vf]=true;
     while (!q.empty()){
           i=q.front();
           q.pop();
           for (vector<int>::iterator it=g[i].begin();it!=g[i].end();it++)
            if (!viz[*it] && r[i][*it]>0) {
                          viz[*it]=true;
                          q.push(*it);}
            }
     } 
void critice(){
     int i,j,k;
     bool w;
     for (k=1;k<=m;++k){
         i=a[k][0];
         j=a[k][1];
         if (r[i][j]==0 || r[j][i]==0)
         {
         r[i][j]++; 
         r[j][i]++;           
         w=false;
         bfs(1);
         if (viz[n]) {
          bfs(n);
          r[j][i]--;
          if (viz[1]) w=true;}
         if (w) v[++nr]=k;
         r[i][j]--; 
         r[j][i]--; 
         }
         } 
     fout<<nr<<'\n';
     for (i=1;i<=nr;++i) fout<<v[nr]<<'\n';
     }
int main(){
    citeste();
    flux();
    critice();
    return 0;
}