Τρίτη, 8 Μαρτίου 2011 4:00 μμ
			από το μέλος
			
ikaragkiozoglou 
			
		 
		Maximum Flow - Edmonds-Karp Algorithm
	 
	
		 I post my implementation of the Edmonds-Karp Algorithm. link to pastebin http://pastebin.com/HrxTvN4m
#include <iostream>
#include <climits>
#define MAXN 100
using namespace std;
typedef struct node_t node_t;
typedef struct edge_t edge_t;
struct edge_t {
    int cap, ni,i;
};
struct node_t{
    int i;
    edge_t edges[MAXN];
};
node_t nodes[MAXN];
int nedges[MAXN]={0};
int edmondskarp(int source, int sink, int n){
    int max = 0;
    while(true){
        int q[MAXN]={0}, mins[MAXN]={INT_MAX}, h=0,t=0,c,i,j,min=INT_MAX;
        edge_t *pre[MAXN]={NULL}, *u;
        q[t++]=source;
        while(t>h && pre[sink]==NULL){
            c = q[h++];
            for(i=0;i<n;i++) {
                if(nodes[c].edges[i].cap>0 && pre[nodes[c].edges[i].ni]==NULL){
                    q[t++]=nodes[c].edges[i].ni;
                    pre[nodes[c].edges[i].ni]=&nodes[c].edges[i];
                    if(mins[c]>nodes[c].edges[i].cap) mins[nodes[c].edges[i].ni]=nodes[c].edges[i].cap;
                    else mins[nodes[c].edges[i].ni]=mins[c];
                }
            }
        }
        if(pre[sink]==NULL) break;
        for(u=pre[sink];pre[(*u).i]!=NULL;u=pre[(*u).i]){
            (*u).cap-=mins[sink];
        }
        max+=mins[sink];
    }
    return max;
}
 
int main(){
    int n, m, i, k, j, c,maxflow;
    cin >> n >> m;
    for(i=0;i<m;i++) {
        cin >> k >> j >> c;
        nodes[k].i=k;
        nodes[k].edges[nedges[k]].i=k;
        nodes[k].edges[nedges[k]].cap =c;
        nodes[k].edges[nedges[k]].ni=j;
        nedges[k]++;
    }
    maxflow=edmondskarp(0,n-1,n);
    cout << maxflow << endl;
    cin >> i;
    return 0;
}
    
a2a_linkname="Maximum Flow - Edmonds-Karp Algorithm";a2a_linkurl="http://www.studentguru.gr/blogs/ikaragkiozoglou/archive/2011/03/08/maximum-flow-edmonds-karp-algorithm.aspx";