Cod sursa(job #683493)

Utilizator morlockRadu Tatomir morlock Data 20 februarie 2012 18:59:43
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include<fstream>
#include <vector>
#include <algorithm>
#define NMAX 2000

using namespace std;

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

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

    in>>n>>m;
    in>>K;

    for (int i=1; i<=K; ++i)
     {
         in>>loc;
         v.push_back(loc);
     }

     sort(v.begin(), v.end());

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

}

int dist(int x0, int y0)
{ int i, minim, k, ok, viz[NMAX], d[NMAX];

    for (i = 1; i<=n; i++)
    {
        d[i] = C[x0][i];
        viz[i] = 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];
               }
        }
        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[0]) + dist(v[0],n);

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

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

         costmin = Cost;

         while (next_permutation(v.begin(), v.end()))
          {
              Cost = dist(1,v[0]);
               for (int i=0; i<K-1; ++i)
                Cost += dist(v[i], v[i+1]);

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

              costmin = min(Cost, costmin);
          }

         out<<costmin;
     }


return 0;
}