Cod sursa(job #931508)

Utilizator memaxMaxim Smith memax Data 28 martie 2013 11:56:18
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include<iostream>
#include<vector>
#include<fstream>
#include<queue>
#include<cstring>
using namespace std;
#define INF 100000000


int search(int n, vector<int> v[], int p[]); 

int main(){
    int n,m;
    ifstream cinr("maxflow.in");
    cinr >> n >> m;
    vector<int> v[n+1];
    int p[n+1];
    for(int i=0; i<m; i++){
            int a,b,c;
            cinr >> a >> b >> c;
            v[a].push_back(b);
            v[a].push_back(c);
            v[a].push_back(c);
            } cinr.close();
            
    int min=search(n,v,p);
    while(p[n]!=0){
                   int i=n;
                   while(i!=1){
                                  int r; r=p[i];
                                  for(int j=0; j<v[r].size(); j+=3)
                                          if(v[r][j]==i){
                                                         v[r][j+2]-=min;
                                                         break;
                                                         }
                                  for(int j=0; j<v[i].size(); j+=3)
                                          if(v[i][j]==r){
                                                         v[i][j+2]+=min;
                                                         break;
                                                         }
                                  i=r;
                                  }              
                   min=search(n,v,p);
                   }
    int sum=0;
    for(int i=0; i<v[1].size(); i+=3){
            sum+=v[1][i+1]-v[1][i+2];
            }
    ofstream cour("maxflow.out");
    cour << sum;
    cour.close();
    }
    
int search(int n, vector<int> v[], int p[]){
    bool vis[n+1];
    memset(vis,0,sizeof(vis));
     for(int i=1; i<=n; i++) p[i]=0;
    queue<int> q;
    q.push(1); q.push(INF);
    int min;
    while(!q.empty()){
                    int r;
                    r=q.front(); q.pop();
                    min=q.front(); q.pop();
                    vis[r]=true;
                    for(int i=0; i<v[r].size(); i+=3){
                            if(!vis[v[r][i]] && v[r][i+2]!=0){
                                              p[v[r][i]]=r;
                                              if(v[r][i+2]<min) min=v[r][i+2];
                                              if(v[r][i]==n) return min;
                                              q.push(v[r][i]); q.push(min);
                                              }
                            }
                    }
    return min;
    }