Cod sursa(job #686230)

Utilizator morlockRadu Tatomir morlock Data 21 februarie 2012 15:31:53
Problema Ubuntzei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define nmax 2005
using namespace std;


vector<int> v;
int n, m, k;
long long a[nmax][nmax];


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

    scanf("%d %d", &n, &m);
    scanf("%d", &k);


     for (int i=1; i<=k; ++i)
      {
          scanf("%d", &x);
          v.push_back(x);
      }

     for (int i=1; i<=m; ++i)
      {
          scanf("%d %d %d", &x, &y, &c);
          a[x][y] = a[y][x] = c;
      }
}

void costuri()
{ int maxim = 100005;

    for (int i=1; i<=n; ++i)
     for (int j=1; j<=n; ++j)
       if (a[i][j] == 0 && i != j)
         a[i][j]=maxim;

    for (int k=1; k<=n; ++k)
     for (int i=1; i<=n; ++i)
      for (int j=1; j<=n; ++j)
       if ( a[i][j] > a[i][k] + a[k][j] )
        a[i][j] = a[i][k] + a[k][j];
}


int main()
{ int cost, costmin;

    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

  citeste();

  costuri();



     if (k == 0)
      {
          printf("%d", a[1][n]);
      }

     if (k == 1)
      {
          cost = a[1][v[0]] + a[v[0]][n];
          printf("%d", cost);
      }

     if (k > 1)
      {
          cost = a[1][v[0]];
           for (int i=0; i<k-1; ++i)
            cost += a[v[i]][v[i+1]];

          cost += a[v[k-1]][n];

          costmin = cost;

          while ( next_permutation(v.begin(), v.end()) )
           {
               cost = a[1][v[0]];
                for (int i=0; i<k-1; ++i)
                 cost += a[v[i]][v[i+1]];

               cost += a[v[k-1]][n];

               costmin = min(costmin, cost);

           }
       printf("%d", costmin);

      }

}