Pagini recente » Cod sursa (job #109540) | Cod sursa (job #1599825) | Cod sursa (job #1062512) | Cod sursa (job #636294) | Cod sursa (job #2523151)
#include <bits/stdc++.h>
#define NMAX 2005
#define inf 1 << 30 -1
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int G[NMAX][NMAX];
int K,M,N;
vector <int> Oras_Pr;
void citire()
{
f>> N >> M;
f >> K;
for(int i =1 ; i <= K ;i++)
{
int pr;
f >> pr;
Oras_Pr.push_back(pr);
}
for(int i = 1; i <= N;i++)
for(int j = 1 ; j <= N ; j++)
if(i != j ) G[i][j] = inf;
else G[i][j] = 0;
for(int i = 1; i <= M ; i++)
{
int x,y,cost;
f >> x >> y >> cost;
G[x][y]= cost;
G[y][x]= cost;
}
}
void Roy_Floyd()
{
int k,i,j;
for(k = 1 ; k <= N ; k++)
{
for(i = 1 ; i <= N ; i++)
for(j = 1 ; j <= N ;j++)
if(G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[i][k] + G[k][j];
}
}
int cost_final;
void Parcurgere(int start)
{
/// vezi costul cel mai mic al prietenului
/// de pe linia start
int cost_min = inf ;
int next_nod= 0;
int poz_pr_use;
if(Oras_Pr.size())
{
for( int i = 0 ; i < Oras_Pr.size();i++)
{
if(G[start][Oras_Pr[i]] < cost_min)
{
cost_min = G[start][Oras_Pr[i]];
poz_pr_use = i;
next_nod = Oras_Pr[i];
}
}
cost_final += cost_min;
Oras_Pr.erase(Oras_Pr.begin() + poz_pr_use);
Parcurgere(next_nod);
}
else
cost_final += G[start][N];
}
int main()
{
citire();
Roy_Floyd();
Parcurgere(1);
g<< cost_final;
return 0;
}