Cod sursa(job #1319056)

Utilizator Walrus21andrei Walrus21 Data 16 ianuarie 2015 17:18:02
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define mm 250001
#define nm 50001
#define mx 1001
#define mk 16

using namespace std;

struct s{int x,y,c;} G[mk+2];

bool cmp(pair<int,int> a,pair<int,int> b)
{
    return a.second<b.second;
}

bool cmp1(s i,s j)
{
    return i.c<j.c;
}


int i,j,n,m,x,y,c,K,p,q,ac,C[nm],L[mk],LC[mk+2][nm];
bool a[mk+2],b[mk+2];
vector <pair<int,int> > g[nm];

void dj(int k)
{
    int j;
    for(j=0;j<g[k].size();j++)
    {
        if(C[k]+g[k][j].second<C[g[k][j].first])
        {
            C[g[k][j].first]=C[k]+g[k][j].second;
            LC[L[p]][g[k][j].first]=C[g[k][j].first];
        }
    }
    for(j=0;j<g[k].size();j++)
     dj(g[k][j].first);
}

void apm()
{
    int j=2;bool o;
    b[G[1].x]=b[G[1].y]=1; ac=G[1].c;
    for(i=2;i<=q;i++)
     if(!a[i])
     if((b[G[i].x]&&!b[G[i].y])||(b[G[i].y]&&!b[G[i].y]))
     {b[G[i].x]=1; b[G[i].y]=1; ac+=G[i].c; a[i]=1;o=1; i=j-1;}
     else if(!(o)) {o=1; j=i;}
}



int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d%d",&n,&m,&K);
    for(i=1;i<=K;i++) scanf("%d",&L[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back(make_pair(y,c));
    }
    for(i=1;i<=n;i++) stable_sort(g[i].begin(),g[i].begin()+g[i].size(),cmp);
    L[0]=1; L[K+1]=n;
    for(p=0;p<=K+1;p++) {for(i=1;i<=n;i++) if(i!=L[p]) C[i]=mx; C[L[p]]=0;
    dj(L[p]);}
    for(i=0;i<=K+1;i++)
     for(j=0;j<=K+1;j++)
     if(i!=j&&LC[L[i]][L[j]]) {q++; G[q].x=L[i]; G[q].y=L[j]; G[q].c=LC[L[i]][L[j]];}
    stable_sort(G,G+K+1,cmp1); apm(); printf("%d",ac);
    return 0;
}