Cod sursa(job #1369002)

Utilizator bobbychivescuChivescu Bogdan-Andrei bobbychivescu Data 2 martie 2015 21:04:23
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#define inf 500003

using namespace std;

int n, m, p, c[51], dmin[501], cost;
vector<int> g[501], gc[501];
class ComparVf
{public:
    bool operator () (const int& a, const int& b)
    {
        return dmin[a]>dmin[b];
    }
};
priority_queue<int, vector<int>, ComparVf> h;

void djk(int i)
{
    int  j, vf;
    for(j=1; j<=n*n; ++j)dmin[j]=inf;
    dmin[i]=0;
    h.push(i);
    while(!h.empty()){
        vf=h.top();h.pop();
        for(j=0; j<g[vf].size(); ++j)
            if(dmin[g[vf][j]]>dmin[vf]+gc[vf][j]){
                dmin[g[vf][j]]=dmin[vf]+gc[vf][j];
                h.push(g[vf][j]);
            }
    }
}

void divide(int s, int d, int pc)
{
    djk(pc);
    int i, j, mn=inf;
    if(s==d){
        cost+=dmin[c[s]];
    }
    else{
        for(i=s; i<=d; ++i)if(dmin[c[i]]<mn){
            mn=dmin[c[i]];
            j=i;
        }
        cost+=dmin[c[j]];
        if(j>s)divide(s, j-1, c[j]);
        if(j<d)divide(j+1, d, c[j]);
    }
}
int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);
    scanf("%d%d%d",&p, &n, &m);
    int i, j, k, l;
    for(i=1; i<=m; ++i){
        scanf("%d%d%d", &j, &k, &l);
        g[j].push_back(k);
        gc[j].push_back(l);
        g[k].push_back(j);
        gc[k].push_back(l);
    }
    for(i=1; i<=p; ++i)scanf("%d", &c[i]);
    divide(1, p, 1);
    printf("%d", cost);
    return 0;
}