Cod sursa(job #736095)

Utilizator visanrVisan Radu visanr Data 17 aprilie 2012 20:01:07
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.3 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
using namespace std;


#define nmax 1001
#define inf 0x3f3f3f3f

int n,m,from,to,c,source=1,destination;
bool visit[nmax];
int capacity[nmax][nmax],currentFlow[nmax][nmax],father[nmax];
vector<int> graph[nmax];

bool check();

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%i %i", &n,&m);
    destination=n;
    int i;
    for(i=1;i<=m;i++)
    {
                     scanf("%i %i %i", &from,&to,&c);
                     capacity[from][to]=c;
                     graph[from].push_back(to);
                     graph[to].push_back(from);
    }
    int maxflow=0;
    while(check()==true)
    {
              vector<int>::iterator it;
              for(it=graph[destination].begin();it!=graph[destination].end();++it)
              {
                       if(visit[*it] && capacity[*it][destination]!=currentFlow[*it][destination])
                       {
                                      int node=*it;
                                      int minflow=inf;
                                      father[destination]=node;
                                      for(node=destination;node!=source;node=father[node])
                                      {
                                                     minflow=min(minflow,capacity[father[node]][node]-currentFlow[father[node]][node]);
                                      }
                                      if(minflow)
                                      {
                                                  for(node=destination;node!=source;node=father[node])
                                                  {
                                                                              currentFlow[father[node]][node]+=minflow;
                                                                              currentFlow[node][father[node]]-=minflow;
                                                  }
                                                  maxflow+=minflow;
                                      }
                       }
              }
    }
    printf("%i\n", maxflow);
    //scanf("%i", &i);
    return 0;
}                                     
                                      
bool check()
{
     memset(visit,false,sizeof(visit));
     visit[source]=true;
     queue<int> Nodes;
     Nodes.push(source);
     while(!Nodes.empty())
     {
                          int node=Nodes.front();
                          Nodes.pop();
                          if(node==destination) break;
                          vector<int>::iterator it;
                          for(it=graph[node].begin();it!=graph[node].end();++it)
                          {
                                    if(visit[*it]==false && currentFlow[node][*it]<capacity[node][*it])
                                    {
                                                          visit[*it]=true;
                                                          Nodes.push(*it);
                                                          father[*it]=node;
                                    }
                          }
     }
     return visit[destination];
}