Cod sursa(job #868447)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 31 ianuarie 2013 02:28:50
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream>
#include<vector>
#include <bitset>
#include <cassert>
#include <memory.h>
#include <algorithm>
#define dim 205

using namespace std;


ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int A[dim][dim];
int i,j,k,K,a,b,c,n,m,MIN;
vector<int>v;
inline int min(int a,int b){
	if(a<b)
		return a;
	return b;
}
int main () {
	
	f>>n>>m;
	
	f>>K;
	for(i=1;i<=K;++i){
		f>>a;
		v.push_back(a);
	}
	for(i=1;i<=m;++i){
		
		f>>a>>b>>c;
		
		A[a][b]=A[b][a]=c;
	}
	MIN=100000;
	for(k=1;k<=n;++k){
		
		for(i=1;i<=n;++i) {
			
			for(j=1;j<=n;++j){
				
				if(i!=j && A[i][k] && A[k][j]) {
					
					if(!A[i][j] || A[i][j]>A[i][k]+A[k][j])
						A[i][j]=A[i][k]+A[k][j];
				}
			}
		}
	}
	if(K){sort(v.begin(),v.end());
	do {
		int ans=A[1][v.front()] + A[v.back()][n];	
			for (int i=0;i<v.size()-1;++i)
				ans+= A[v[i]][v[i + 1]];
		MIN=min(MIN,ans);
	}while (next_permutation(v.begin(),v.end()));
	}
	if(K)
		g<<MIN<<"\n";
	else
		g<<A[1][n]<<"\n";
	return 0;
}