Cod sursa(job #1038845)

Utilizator ion824Ion Ureche ion824 Data 22 noiembrie 2013 00:05:53
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef struct lnod{
        int vf;
        lnod *next;
        }*Nod;

const int INF = 0x3f3f3f3f;

int N,M,maxflow;
int C[1005][1005];
int Q[1005],from[1005];
bool viz[1005];
Nod V[1005];

inline void add(int x,int y){
       Nod p = new lnod;
       p->vf=y;
       p->next=V[x];
       V[x]=p;
       }

bool bfs(){
    int ic=1,vc=1,prec;
    unsigned int i;
    bool found=0;
    Q[ic]=1;
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    from[1]=-1;
    
    while(ic<=vc)
    {
      prec=Q[ic++]; 
      
      for(Nod p=V[prec];p;p=p->next)
        if(C[prec][p->vf] > 0 && !viz[p->vf])
        {
          if(p->vf != N) Q[++vc]=p->vf;
          viz[p->vf]=1;
          from[p->vf]=prec;                    
        }                 
    }
       
    if(!viz[N]) return 0;   
       
    int vf=N, mn=INF, prev;
    while(from[vf]!=-1)
    {
      prev=from[vf];
      if(C[prev][vf] < mn) mn=C[prev][vf];
      vf=prev;              
    }   
    
    vf=N;
    while(from[vf]!=-1)
    {
      prev=from[vf];
      C[prev][vf]-=mn;
      C[vf][prev]+=mn;
      vf=prev;     
    }
    
    if(mn!=INF){ maxflow += mn; return 1; }
      else return 0;   
}


int main(){
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    int i,x,y,c;
    cin>>N>>M;
    
    for(i=1;i<=M;++i)
    {
      cin>>x>>y>>c;
      add(x,y);
      add(y,x);
      C[x][y]=c;                 
    }
    
    while(bfs()) ;
    
    cout<<maxflow;
    
    
 return 0;   
}