Cod sursa(job #702129)

Utilizator informatician28Andrei Dinu informatician28 Data 1 martie 2012 19:47:24
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
}