Cod sursa(job #202178)

Utilizator hadesgamesTache Alexandru hadesgames Data 6 august 2008 16:21:55
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
ifstream in("cc.in");
ofstream out("cc.out");
vector<int> dist(300),ver(300);
vector<vector<int> > a(300);
queue<int> q;
int d[300][300],pred[305],cap[300][300],n,cost;
int flux()
{
	int nod,creste;
	q.push(0);
	vector<int>::iterator it;
	pred[2*n+1]=0;
	fill(all(dist),1<<30);
	dist[0]=0;
	while (!q.empty())
	{
		nod=q.front();
		fori(it,a[nod])
			if (cap[nod][*it]&&dist[nod]+d[nod][*it]<dist[*it])
			{
				dist[*it]=dist[nod]+d[nod][*it];
				pred[*it]=nod;
				if(!ver[*it])
				{
					ver[*it]=1;
					q.push(*it);
				}

			}
		q.pop();
		ver[nod]=0;
	}
	if (!pred[2*n+1])
		return 0;
	nod=2*n+1;
	creste=1<<30;
	while (nod)
	{
		creste=min(creste,cap[pred[nod]][nod]);
		nod=pred[nod];
	}
	nod=2*n+1;
	cost+=dist[2*n+1];
	while (nod)
	{
		cap[pred[nod]][nod]-=creste;
		cap[nod][pred[nod]]+=creste;
		nod=pred[nod];
	}
	return 1;

}
int main()
{
	int i,j;
	in>>n;
	FOR(i,1,n)
		FOR(j,n+1,2*n)
		{
			in>>d[i][j];
			d[j][i]=-d[i][j];
			a[i].pb(j);
			a[j].pb(i);
			cap[i][j]=1;
		}
	FOR(i,1,n)
	{
		a[i].pb(0);
		a[0].pb(i);
		cap[0][i]=1;
		a[i+n].pb(2*n+1);
		a[2*n+1].pb(i+n);
		cap[i+n][2*n+1]=1;
	}
	while (flux());
	out<<cost<<'\n';
	in.close();
	out.close();
	return 0;
}