Cod sursa(job #641262)

Utilizator morlockRadu Tatomir morlock Data 27 noiembrie 2011 18:31:53
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include<fstream>
#define NMAX 2000

using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, INFINIT=100001, C[NMAX][NMAX], K, v[NMAX];

void citeste()
{ int x, y, z;

    in>>n>>m;
    in>>K;
    for (int i=1; i<=K; ++i)
     in>>v[i];

    for (int i=1; i<=m; ++i)
     {
         in>>x>>y>>z;
         C[x][y]=C[y][x]=z;
     }

}

void dijkstra(int x0)
{
    int i, j, minim, k, ok;
    int viz[NMAX], d[NMAX], tata[NMAX];
    for (i = 1; i<=n; i++) {
        d[i] = C[x0][i];
        tata[i] = x0;
        viz[i] = 0;
    }
    tata[x0] = 0;
    viz[x0] = 1; ok = 1;
    while (ok) {
        minim = INFINIT;
        for (i = 1; i<=n; i++)
            if (!viz[i] && minim>d[i]) {
                minim = d[i];
                k = i;
            }
        if (minim != INFINIT) {
            viz[k] = 1;
            for (i = 1; i<=n; i++)
               if (!viz[i] && d[i]>d[k]+C[k][i]) {
                   d[i] = d[k]+C[k][i];
                   tata[i] = k;
               }
        }
        else ok = 0;
    }

    for (int h=1; h<=n; ++h)
     if (d[h] == INFINIT) cout<<"0 "; else cout<<d[h]<<" ";
     cout<<'\n';

}


int dist(int x0, int y0)
{ int i, j, minim, k, ok, viz[NMAX], d[NMAX], tata[NMAX];
    for (i = 1; i<=n; i++)
    {
        d[i] = C[x0][i];
        tata[i] = x0;
        viz[i] = 0;
    }
    tata[x0] = 0;
    viz[x0] = 1; ok = 1;
    while (ok)
    {
        minim = INFINIT;
        for (i = 1; i<=n; i++)
            if (!viz[i] && minim>d[i])
            {
                minim = d[i];
                k = i;
            }
        if (minim != INFINIT)
        {
            viz[k] = 1;
            for (i = 1; i<=n; i++)
               if (!viz[i] && d[i]>d[k]+C[k][i])
               {
                   d[i] = d[k]+C[k][i];
                   tata[i] = k;
               }
        }
        else ok = 0;
    }

  return d[y0];
}

int main()
{ int Cost=0;

    citeste();
        for (int i=1; i<=n; ++i)
     {
         for (int j=1; j<=n; ++j)
          if (C[i][j] == 0) C[i][j]=INFINIT;
     }

   if ( K == 0)
    out<<dist(1,n);

   if (K == 1)
    out<<dist(1,v[1]) + dist(v[1],n);

    if (K > 1)
     {
         Cost += dist(1,v[1]);
         for (int i=1; i<K; ++i)
          Cost += dist(v[i], v[i+1]);

         Cost += dist(v[K], n);

         out<<Cost;
     }




return 0;
}