Pagini recente » Cod sursa (job #495446) | Cod sursa (job #2334977) | Cod sursa (job #2692655) | Cod sursa (job #2759649) | Cod sursa (job #2522784)
#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];
}
}
bool E_Prieten(int nod)
{
for(int i = 0 ; i < Oras_Pr.size(); i++)
if(nod == Oras_Pr[i])
{
Oras_Pr.erase(Oras_Pr.begin()+i);
return true;
}
return false;
}
int Determina_prieten(int linie, int &cost, int &next)
{
int dist_min = inf;
int Next_prieten;
for(int i = 1; i <= N ; i++)
{
if(G[linie][i] < dist_min && E_Prieten(i))
{
dist_min = G[linie][i];
Next_prieten = i;
}
}
cost = dist_min;
next = Next_prieten;
/// nu mai sunt prieteni de vizitati
if( dist_min == inf)
return 0;
return 1;
}
int cost_final;
void Parcurgere(int start)
{
/// vezi costul cel mai mic al prietenului
/// de pe linia start
int cost = 0 ;
int next = 0;
if( Determina_prieten(start,cost,next) == 1)
{
cost_final += cost;
Parcurgere(next);
}
else
{
cost_final += G[start][N];
}
}
int main()
{
citire();
Roy_Floyd();
Parcurgere(1);
g<< cost_final;
return 0;
}