Cod sursa(job #109115)

Utilizator mastermageSchneider Stefan mastermage Data 24 noiembrie 2007 18:51:31
Problema Traseu Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

#define INF 0x7f7f7f7f
#define maxN 70
#define maxK 400

struct nd{int v;nd*u;nd(){}nd(int pv,nd*pu){v=pv,u=pu;}};

int n,m,gs,res,mat[maxN][maxN],gr[maxN];
nd*lvec[maxN];
int k,l,dis[maxK][maxK];


void inputFunc(){
	FILE*fi=fopen("traseu.in","r");
	fscanf(fi,"%d %d",&n,&m);
	for(int i=0;i<m;i++){
		int a,b,c;
		fscanf(fi,"%d %d %d",&a,&b,&c);a--,b--;
		lvec[a]=new nd(b,lvec[a]);
		mat[a][b]=c;gs+=c;
		gr[a]++,gr[b]--;
	}
	fclose(fi);
}

void outputFunc(){FILE*fi=fopen("traseu.out","w");fprintf(fi,"%d",res);fclose(fi);}

void roy(){
	for(int i=0;i<n;i++)for(int j=0;j<n;j++){
		int c=mat[i][j];
		for(int k=0;k<n;k++){
			int a=mat[i][k],b=mat[k][j];
			if(a && b && (!c || a+b<c))c=a+b;
		}
		mat[i][j]=c;
	}
}

void bellman(){
	queue<int> qu;
	int d[maxK],lst[maxK]={},viz[maxK]={};
	memset(d,0x7f,sizeof d);
	d[0]=0;
	
	qu.push(0);
	while(!qu.empty()){
		int c=qu.front(); qu.pop(); viz[c]=0;
		for(int i=0;i<=l;i++)if(dis[c][i]!=INF){
			int urm=d[c]+dis[c][i];
			if(urm<d[i]){
				d[i]=urm,lst[i]=c;
				//if(!viz[i])qu.push(i),viz[i]=1;
				qu.push(i);
			}
		}
		
	}
	
	int i=l;
	while(i){
		int a=lst[i],b=i;
		dis[b][a]=-dis[a][b];
		dis[a][b]=INF;
		i=a;
	}
	
	res+=d[l];
}

int main(){
	inputFunc();
	roy();roy();
	for(int i=0;i<n;i++)if(gr[i]>0)k+=gr[i];
	l=2*k+1;
	
	memset(dis,0x7f,sizeof dis);
	int ik=1;
	for(int i=0;i<n;i++){
		int c=-gr[i]+1;
		while(c--,c>0){
			int jk=k+1;
			for(int j=0;j<n;j++){
				int c2=gr[j]+1;
				while(c2--,c2>0){
					dis[ik][jk]=mat[i][j];
					dis[jk++][l]=0;
				}
			}	
			dis[0][ik++]=0;
		}
	}
	
	for(int i=0;i<k;i++){
		bellman();
	}
	
	res+=gs;
	outputFunc();
	return 0;
}