Cod sursa(job #732069)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 9 aprilie 2012 17:17:16
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<stdio.h>
#include<vector>

#define maxp 53
#define maxn 505
#define INF (1<<29)
#define pb push_back
#define mp make_pair

using namespace std;

FILE*f=fopen("team.in","r");
FILE*g=fopen("team.out","w");

int n,m,p;
int C[maxp][maxn],D[maxn],viz[maxn],opt[maxp][maxp][maxp],A[maxp];
vector< pair<int,int> >G[maxn];

inline int min ( const int &a , const int &b ){
	return a <= b ? a : b;
}

inline void citire () {
	
	fscanf(f,"%d %d %d",&p,&n,&m);
	
	int x,y,c;
	for ( int i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d",&x,&y,&c);
		G[x].pb(mp(y,c));
		G[y].pb(mp(x,c));
	}
	
	for ( int i = 1 ; i <= p ; ++i ){
		fscanf(f,"%d",&A[i]);
	}
}

inline void distante () {
	
	D[0] = INF;
	
	for ( int ii = 1 ; ii <= p ; ++ii ){
		int nod = A[ii];
		
		for ( int i = 1 ; i <= n ; ++i ){
			D[i] = INF; viz[i] = 0;
		}
		D[nod] = 0;
		
		for ( int i = 1 ; i <= n ; ++i ){
			int best = 0;
			for ( int j = 1 ; j <= n ; ++j ){
				if ( !viz[j] && D[j] < D[best] ){
					best = j;
				}
			}
			
			viz[best] = 1;
			for ( vector< pair<int,int> >::iterator itt = G[best].begin() ; itt != G[best].end() ; ++itt ){
				int nodvcn = itt->first;
				if ( D[nodvcn] > D[best] + itt->second ){
					D[nodvcn] = D[best] + itt->second;
				}
			}
		}
		
		for ( int i = 1 ; i <= n ; ++i ){
			C[ii][i] = D[i];
		}
	}
}

inline void rezolva () {
	
	for ( int l = 2 ; l <= p ; ++l ){
		for ( int i = 1 ; i + l - 1 <= p ; ++i ){
			int j = i + l - 1;
			
			for ( int k = i ; k <= j ; ++k ){
				
				int min1 = INF; //i;k-1
				for ( int u = i ; u <= k - 1 ; ++u ){
					min1 = min(min1,opt[i][k-1][u]+C[u][A[k]]);
				}
				int min2 = INF; //k+1;j
				for ( int u = k + 1 ; u <= j ; ++u ){
					min2 = min(min2,opt[k+1][j][u]+C[u][A[k]]);
				}
				
				if ( min1 == INF )	min1 = 0;
				if ( min2 == INF )	min2 = 0;
				
				opt[i][j][k] = min1 + min2;
			}
		}
	}
	
	int sol = INF;
	for ( int i = 1 ; i <= p ; ++i ){
		sol = min(sol,opt[1][p][i]+C[i][1]);
	}
	
	fprintf(g,"%d\n",sol);
}

int main () {
	
	citire();
	distante();
	rezolva();
	
	fclose(f);
	fclose(g);
	
	return 0;
}