Cod sursa(job #784595)

Utilizator cristianalex81Cristian Alexandru cristianalex81 Data 6 septembrie 2012 14:26:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

#define dim 1005
#define inf 1<<30
#define pb push_back

int a[dim][dim],n,m;
vector <int> aa[dim];
int source,sink;
bool viz[dim];
int par[dim];

bool cit()
{
    int t1,t2,x;
	scanf("%d %d",&n,&m);
    for (int i=0;i<m;i++)
    {
        scanf("%d %d %d",&t1,&t2,&x);
		a[t1][t2]=x;
		aa[t1].pb(t2);
		aa[t2].pb(t1);
    }
}

bool bf()
{
	queue <int> q;
	memset(viz,false,sizeof(viz));
	memset(par,0,sizeof(par));
	q.push(source);
	viz[source]=true;
	while (!q.empty())
	{
		int nod = q.front();
		q.pop();
		if (nod != sink)//skip the sink node because he is source
			for (int i=0;i<aa[nod].size();i++)
			{
				int vec = aa[nod][i];
				if ((a[nod][vec]>0)&&(!viz[vec]))//road and not visited
				{
					q.push(vec);
					viz[vec]=true;
					par[vec]=nod;
				}
			}
	}
	return viz[sink];
}

int minflow() //min flow on path func
{
	int fmin = inf;
	for (int nod=sink;nod!=source;nod=par[nod])
	{
		if(fmin > a[par[nod]][nod])
			fmin = a[par[nod]][nod];
	}
	return fmin;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	cit();
    int flow = 0;
    source = 1;
    sink = n;
        while (bf())
        {
            for (int i=0;i<aa[sink].size();i++)
            {
                int nod = aa[sink][i];
                if((a[nod][sink]!=0)&&(viz[nod]))//if unique road to sink
                {
                    par[sink]=nod; // augment the path
                    int fmin = minflow();
                    if (fmin>0)
                    {
                        for (nod=sink;nod!=source;nod=par[nod]) // update flux path;
                        {
                            a[par[nod]][nod]-=fmin;
                            a[nod][par[nod]]+=fmin;
                        }
                        flow += fmin; //update flux;
                    }
                }
            }
        }
    printf("%d\n",flow);
	return 0;
}