Cod sursa(job #870373)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 3 februarie 2013 12:26:24
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;

#define NMAX 211
#define INF 0x3f3f3f3f
#define pb push_back

vector <int> v[NMAX];
int cap[NMAX][NMAX],cost[NMAX][NMAX],inq[NMAX],d[NMAX],c[NMAX*NMAX],p[NMAX],n;

inline int bellman_ford(int start, int finish)
{
	int st,dr,nod;
	memset(d,INF,sizeof(d));
	memset(inq,0,sizeof(inq));
	memset(p,0,sizeof(p));
	st=1;
	dr=1;
	c[st]=start;
	inq[start]=1;
	d[start]=0;
	p[start]=0;
	while(st<=dr) {
		nod=c[st];
		st++;
		inq[nod]=0;
		for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++) 
            if(cap[nod][*it]>=1 && d[*it]>d[nod]+cost[nod][*it]) {
				d[*it]=d[nod]+cost[nod][*it];
				p[*it]=nod;
				if(inq[*it]==0) {
					c[++dr]=*it;
					inq[*it]=1;
				}
			}
	}
	if(d[finish]!=INF) {
		for(nod=finish;nod!=start;nod=p[nod]) {
			cap[p[nod]][nod]--;
			cap[nod][p[nod]]++;
		}
		return d[finish];
	}
	return INF;
}

int main ()
{
	int n,i,j,cmin,aux;
	ifstream f("cc.in");
	ofstream g("cc.out");
	f>>n;
	for(i=1;i<=n;i++)
		for(j=n+1;j<=n+n;j++) {
			f>>cost[i][j];
			cost[j][i]=-cost[i][j];
			v[i].pb(j);
			v[j].pb(i);
			cap[i][j]=1;
		}
	f.close();
	for(i=1;i<=n;i++) {
		v[0].pb(i);
		v[i].pb(0);
		cap[0][i]=1;
	}
	for(i=n+1;i<=n+n;i++) {
		v[i].pb(2*n+1);
		v[2*n+1].pb(i);
		cap[i][2*n+1]=1;
	}
	cmin=0;
	aux=0;
	while(aux!=INF) {
		aux=bellman_ford(0,2*n+1);
		if(aux!=INF)
			cmin=cmin+aux;
	}
	g<<cmin;
	g.close();
	return 0;
}