Cod sursa(job #108979)

Utilizator mastermageSchneider Stefan mastermage Data 24 noiembrie 2007 12:10:34
Problema Traseu Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>

#define maxN 70

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[maxN][maxN],comp[maxN],wei[maxN],who[maxN];
int st[maxN],sum;

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 back(int lvl){
	if(lvl==k){
		if(res>sum)res=sum;return;
	}
	if(sum>=res)return;
	int&i=st[lvl];
	if(!lvl)i=0;else{
		if(comp[lvl-1]==comp[lvl])i=st[lvl-1];else i=0;
	}
	for(;i<l;i++)if(wei[i]){
		wei[i]--;sum+=dis[lvl][i];
		
		back(lvl+1);
		
		wei[i]++;sum-=dis[lvl][i];
	}
	
}

int main(){
	inputFunc(); res=999999999;
	roy();roy();
	for(int i=0;i<n;i++)if(gr[i]<0){
		who[l]=i;wei[l++]=-gr[i];
	}
	for(int i=0;i<n;i++){
		int c=gr[i]+1;
		while(c--,c>0){
			for(int j=0;j<l;j++){
				dis[k][j]=mat[who[j]][i];
			}
			comp[k++]=i;
		}
	}
	
	back(0);
	res+=gs;
	outputFunc();
	return 0;
}