Cod sursa(job #1355800)

Utilizator bobbychivescuChivescu Bogdan-Andrei bobbychivescu Data 22 februarie 2015 23:07:31
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define inf 200000000
using namespace std;
int n, m, k, dmin[2001], d[17][17], c[17];
struct much{
    int b, c;
}a[2003][2003];
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; ++j)dmin[j]=inf;
    dmin[i]=0;
    h.push(i);
    while(!h.empty()){
        vf=h.top();h.pop();
        for(j=1; j<=a[vf][0].b; ++j)
            if(dmin[a[vf][j].b]>dmin[vf]+a[vf][j].c){
                dmin[a[vf][j].b]=dmin[vf]+a[vf][j].c;
                h.push(a[vf][j].b);
            }
    }
}
int main()
{
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    int i, j, l, p;
    for(i=1; i<=k; ++i)scanf("%d", &c[i]);
    for(i=1; i<=m; ++i){
        scanf("%d%d%d", &j, &l, &p);
        a[j][0].b++;
        a[j][a[j][0].b].b=l;
        a[j][a[j][0].b].c=p;

        a[l][0].b++;
        a[l][a[l][0].b].b=j;
        a[l][a[l][0].b].c=p;
    }
    djk(1);
    for(i=1; i<=k; ++i)d[0][i]=d[i][0]=dmin[c[i]];
    d[0][k+1]=d[k+1][0]=dmin[n];
    for(i=1; i<=k; ++i){
        djk(c[i]);
        for(j=i+1; j<=k; ++j)d[i][j]=d[j][i]=dmin[c[j]];
        d[i][k+1]=d[k+1][i]=dmin[n];
    }
    for(i=0; i<=k+1; ++i)c[i]=0;
    c[0]=1;
    j=0; n=0;
    for(i=1; i<=k; i++){
        p=inf;
        for(l=1; l<=k; ++l)if(!c[l] && p>d[j][l]){p=d[j][l]; m=l;}
        n+=p; c[m]=1; j=m;
    }
    n+=d[j][k+1];
    printf("%d", n);
    return 0;
}