Cod sursa(job #964271)

Utilizator ion824Ion Ureche ion824 Data 20 iunie 2013 15:19:27
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 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;
vector<int>::iterator it;
int C[NMAX][NMAX],N,M,X1[10003],Y1[10003];
int T[NMAX],CD[NMAX];
bool viz[NMAX],viz2[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];  
                  }                      
}

int bfs(){
     int ok=0,V,i;
     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(it=G[V].begin();it!=G[V].end();++it)
           if(!viz[*it] && C[V][*it]>0){
                  if((*it)!=N) CD[++CD[0]]=(*it);
                  T[*it]=V;
                  viz[*it]=1;
                  }
       if(viz[N]){ ok=1; update(); viz[N]=0; }                           
     }
    return ok; 
}

int main(){
    ifstream cin("critice.in");
    ofstream cout("critice.out");   
    int i,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;                
    }
    
    while(bfs());
    
    int nod=1;
    
    memset(viz,0,sizeof(viz));
    CD[0]=CD[1]=1; viz[1]=1;
    for(i=0;i<=CD[0];++i){
      nod=CD[i];
      for(it=G[nod].begin();it!=G[nod].end();++it)
        if(!viz[*it] && C[nod][*it]>0)
        {
           CD[++CD[0]]=(*it);
           viz[*it]=1;
        }
    }
    
    memset(viz2,0,sizeof(viz2));
    nod=N; CD[0]=1; CD[1]=N; viz2[N]=1; 
    
    for(i=1;i<=CD[0];++i)
    {
      nod=CD[i];
      for(it=G[nod].begin();it!=G[nod].end();++it)
        if(!viz2[*it] && C[nod][*it]>0){
             CD[++CD[0]]=(*it);
             viz2[*it]=1;
             }                                              
    }
    
    for(i=1;i<=M;++i)
        if(C[X1[i]][Y1[i]]==0) 
          if((viz[X1[i]] && viz2[Y1[i]]) || (viz2[X1[i]] && viz[Y1[i]]))
            sol.pb(i); 
     
    cout<<sol.size()<<'\n';
    for(it=sol.begin();it!=sol.end();++it)cout<<(*it)<<'\n';
  return 0;
}