Cod sursa(job #3309345)

Utilizator Zeno1789Zeno Ciuca Zeno1789 Data 3 septembrie 2025 18:35:53
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define MAX_N 2001
#define INF 999999
using namespace std;

ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");

int n,m,k,d[MAX_N][MAX_N];
vector<int> prieteni;

void init(void) {
	for (int i=0; i<n; i++) {
		for (int j=0; j<n; j++) {
			d[i][j]=INF;
		}
	}
	for (int i=0; i<n; i++) {
		d[i][i]=0;
    }
}

void f(void) {
	for (int k=0; k<n; k++) {
		for (int i=0; i<n; i++) {
			for (int j=0; j<n; j++) {
				if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
			}
		}
	}
}

int solve(void) {
	if (k>0) {
		int start=0,final=n-1,temp,answer=INF;
		sort(prieteni.begin(),prieteni.end());
		do {
			temp=d[start][prieteni.front()]+d[prieteni.back()][final];
			for (int i=0; i<k-1; i++) {
				temp+=d[prieteni[i]][prieteni[i+1]];
			}
			answer=min(temp,answer);
		}while(next_permutation(prieteni.begin(),prieteni.end()));
		return answer;
	}
	else return d[0][n-1];
}

int main() {
	int x,y,c;
	cin>>n>>m>>k;
	for (int i=1; i<=k; i++) {
	    cin>>x;
		x--;
		prieteni.push_back(x);
	}
	init();	
	for (int i=1; i<=m; i++) {
	    cin>>x>>y>>c;
		x--; 
		y--;
		d[x][y]=c; 
		d[y][x]=c;
	} 
	f();
	cout<<solve();
}