Pagini recente » Cod sursa (job #744558) | Cod sursa (job #603614) | Monitorul de evaluare | Cod sursa (job #532992) | Cod sursa (job #702129)
Cod sursa(job #702129)
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define DIM 2001
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int N, M, K, Dist[DIM], Sol, Obiectiv[DIM];
vector< pair< int, int > > G[DIM];
queue< int > Q;
bool InQueue[DIM];
void solve(int node)
{
queue< int > Q;
memset( Dist, INF, sizeof(Dist));
memset( InQueue, false, sizeof(InQueue));
Q.push(node);
InQueue[node] = true;
Dist[node] = 0;
while( !Q.empty() )
{
int x = Q.front();
Q.pop();
InQueue[x] = false;
for(vector< pair < int, int > > ::iterator it = G[x].begin(); it != G[x].end(); ++it)
if( Dist[x] + it -> second < Dist[it -> first] )
{
Dist[it -> first] = Dist[x] + it -> second;
if( InQueue[it -> first] == false )
InQueue[it -> first] = true, Q.push(it -> first);
}
}
}
int main()
{
int i, x, y, c;
in >> N >> M;
in >> K;
for(i = 1; i <= K; i++)
in >> Obiectiv[i];
for(i = 1; i <= M; i++)
{
in >> x >> y >> c;
G[x].pb(make_pair(y,c));
G[y].pb(make_pair(x,c));
}
solve(1);
Sol += Dist[Obiectiv[1]];
if( K >= 2 )
for(i = 1; i < K; i++)
{
solve(Obiectiv[i]);
if( Dist[Obiectiv[i+1]] < INF )
Sol += Dist[Obiectiv[i+1]];
}
solve(Obiectiv[i]);
Sol += Dist[N];
out << Sol;
}