Cod sursa(job #1222825)

Utilizator andreiulianAndrei andreiulian Data 24 august 2014 14:58:57
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<iostream>
#include<cstdio>
#include<cmath>
#define ii 200000
using namespace std;
int N,M,K,C[20],m[2005][2005],d[2005],r[20];
bool viz[2005];
FILE *in=fopen("ubuntzei.in","r"),*out=fopen("ubuntzei.out","w");
void dijkstra(int x);
void ins(int c,int l);
int main()
{
    fscanf(in,"%d%d%d",&N,&M,&K);
    int i,j,x,y,z;

    for(i=1;i<=N;i++)
        {
            for(j=1;j<=N;j++)
                m[i][j]=ii;
            m[i][i]=0;
        }

    for(i=1;i<=K;i++) fscanf(in,"%d",&C[i]);
    for(i=1;i<=M;i++)
    {
        fscanf(in,"%d%d%d",&x,&y,&z);
        m[x][y]=m[y][x]=z;
    }
    for(i=1;i<=K;i++) dijkstra(C[i]);
    r[1]=1;
    r[2]=N;
    for(i=1;i<=K;i++) ins(C[i],i+1);
    //for(j=1;j<=K+2;j++) cout<<r[j]<<' '; cout<<'\n';
    //cout<<m[1][4];
    long long R=0;
    for(i=1;i<=K+1;i++) R+=m[r[i]][r[i+1]];
    fprintf(out,"%d\n",R);
}
void dijkstra(int x)
{
    int i,ok=1,minim,k;
    for(i=1;i<=N;++i) viz[i]=0,d[i]=m[x][i];
    viz[x]=1;

    while(ok)
    {
        minim=200000;
        k=0;
        for(i=1;i<=N;++i)
        {
            if(d[i]<minim && !viz[i]) minim=d[i],k=i;
        }
        if(k)
        {
            viz[k]=1;
            for(i=1;i<=N;++i)
                if(d[i]>d[k]+m[i][k]) d[i]=d[k]+m[i][k];
        }
        else ok=0;
    }
    for(i=1;i<=N;++i) m[x][i]=m[i][x]=d[i];
}
void ins(int c,int l)
{
    int j,mm=2000000000,k;
    for(j=1;j<l;j++)
    {
        if(m[c][r[j]]+m[c][r[j+1]]<mm) mm=m[c][r[j]]+m[c][r[j+1]], k=j;
    }
    for(j=l+1;j>k+1;j--)
    {
        r[j]=r[j-1];
    }
    r[k+1]=c;
}