Cod sursa(job #791575)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 24 septembrie 2012 16:52:21
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 210
#define oo (1<<30)
#define pb push_back
using namespace std;

queue <int> Q;
vector <int> G[NMAx];
int N,S,D,Sol,Dist[NMAx],T[NMAx],Cost[NMAx][NMAx];
bool Flux[NMAx][NMAx],inQ[NMAx];

bool BF() {
	
	int i,Nod,Vecin;
	
	for(i=S;i<=D;Dist[i++]=oo);
	Q.push(S);
	inQ[S]=0;
	Dist[S]=0;
	
	while(!Q.empty()) {
		
		Nod=Q.front();
		Q.pop();
		inQ[Nod]=0;
		
		for(i=0;i<G[Nod].size();i++) {
			
			Vecin=G[Nod][i];
			if(Flux[Nod][Vecin]&&Dist[Vecin]>Dist[Nod]+Cost[Nod][Vecin]) {
				Dist[Vecin]=Dist[Nod]+Cost[Nod][Vecin];
				T[Vecin]=Nod;
				if(!inQ[Vecin]) {
					Q.push(Vecin);
					inQ[Vecin]=1;
					}
				}
			}
		}
	
	return (Dist[D]!=oo);
	
}
void BuildGraph() {
	
	S=0;
	D=2*N+1;
	
	for(int i=1;i<=N;i++) {
		G[S].pb(i);
		Flux[S][i]=1;
		G[i+N].pb(D);
		Flux[i+N][D]=1;
		}
	
}
void Solve() {
	
	int i;
	
	BuildGraph();
	
	while(BF()) {
		
		for(i=D;i;i=T[i]) {
			Flux[T[i]][i]=0;
			Flux[i][T[i]]=1;
			}
		
		Sol+=Dist[D];
		
		}
	
}
void Citire() {
	
	int i,j;
	ifstream in("cc.in");
	in>>N;
	
	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++) {
			G[i].pb(j+N);
			G[j+N].pb(i);
			in>>Cost[i][j+N];
			Cost[j+N][i]=-Cost[i][j+N];
			Flux[i][j+N]=1;
			}
	
	in.close();
	
}
void Afis() {
	
	ofstream out("cc.out");
	out<<Sol<<'\n';
	out.close();
	
}
int main() {
	
	Citire();
	Solve();
	Afis();
	
	return 0;
	
}