Cod sursa(job #964128)

Utilizator ion824Ion Ureche ion824 Data 20 iunie 2013 10:43:54
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
#define pb push_back
using namespace std;
const int NMAX=1003;
const int INF=0x3f3f3f3f;
vector<int> G[NMAX],sol;
int C[NMAX][NMAX],N,M,X1[10003],Y1[10003],Z1[10003];
int T[NMAX],CD[NMAX];
bool viz[NMAX];

void update(){
    int nod,minn=INF;
    
    nod=N; 
    while(T[nod]!=-1){
      if(C[T[nod]][nod]<minn)minn=C[T[nod]][nod];
      nod=T[nod]; 
                  }
    nod=N;
    while(T[nod]!=-1){
      C[T[nod]][nod]-=minn;
      C[nod][T[nod]]+=minn;
      nod=T[nod];  
                  }                      
}


bool bfs(int param){
     int ok=0,V,i,j;
     memset(viz,0,sizeof(viz));
     viz[1]=1; T[1]=-1;
     CD[0]=CD[1]=1;
     for(i=1;i<=CD[0];++i){
       V=CD[i];
         for(j=0;j<G[V].size();++j)
           if(!viz[G[V][j]] && C[V][G[V][j]]>0){
                  if(G[V][j]!=N) CD[++CD[0]]=G[V][j];
                  T[G[V][j]]=V;
                  viz[G[V][j]]=1;
                  }
       if(viz[N]){ ok=1; if(!param){ update(); viz[N]=0; }else return ok; }                           
     }
    return ok; 
}

int main(){
    ifstream cin("critice.in");
    ofstream cout("critice.out");   
    int i,j,x,y,z;
    
    cin>>N>>M;
    
    for(i=1;i<=M;++i){
      cin>>x>>y>>z;
      G[x].pb(y);
      G[y].pb(x);
      C[x][y]=z;
      C[y][x]=z;
      X1[i]=x; Y1[i]=y; Z1[i]=z;                 
    }
    
    while(bfs(0));
    
    for(i=1;i<=N;++i)
      {
      if(C[X1[i]][Y1[i]]==0)
      {
        ++C[X1[i]][Y1[i]];
        if(bfs(1)) sol.pb(i);
        --C[X1[i]][Y1[i]];  
      }
      if(C[Y1[i]][X1[i]]==0)
        {
        ++C[Y1[i]][X1[i]];
        if(bfs(1)) sol.pb(i);
        --C[Y1[i]][X1[i]]; 
        }                 
      }
    
    
    cout<<sol.size()<<'\n';
    for(i=0;i<sol.size();++i)cout<<sol[i]<<'\n';
  return 0;
}