Cod sursa(job #1375947)

Utilizator crazylamaRiclea Andrei crazylama Data 5 martie 2015 15:09:55
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <cstdio>
#define nmax 2005
#define NMAX 100005
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;
FILE *f=fopen("ubuntzei.in","r");
FILE *g=fopen("ubuntzei.out","w");
int n,m,k,vk[nmax],a[nmax][nmax];
void citire()
{
    int i,x,y,z,j;
    fscanf(f,"%d %d",&n,&m);
    fscanf(f,"%d",&k);
    for(i=1;i<=k;i++)
    fscanf(f,"%d",&vk[i]);
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(i!=j)
        a[i][j]=NMAX;
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&x,&y,&z);
        a[x][y]=a[y][x]=z;
    }
}

int main()
{
    int x,y,z,i,valmin=0,minim;
    citire();
    for(x=1;x<=n;x++)
    for(y=1;y<=n;y++)
    for(z=1;z<=n;z++)
    a[x][y]=min(a[x][z]+a[z][y],a[x][y]);
    int nr=0,p=1,p1;
    while(nr<k)
    {
        minim=NMAX;
        for(i=1;i<=k;i++)
        if(a[p][vk[i]]<=minim && p!=vk[i])
        {
            minim=a[p][vk[i]];
            p1=vk[i];
            a[p][vk[i]]=NMAX;
        }
        p=p1;
        nr++;
        valmin=valmin+minim;
    }
    valmin=valmin+a[p][n];
    fprintf(g,"%d",valmin);
    return 0;
}