Cod sursa(job #1026623)

Utilizator SapientiaCHIRILA ADRIAN Sapientia Data 11 noiembrie 2013 20:09:22
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#define Nmax 3001
#define Infinit 2000000000
using namespace std;
int a[Nmax][Nmax];
int vec[Nmax];
int i1,n,k,s=0,minim=Infinit;
vector <int> v;
void reading(int &n,int &k)
{
    int j,m;
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d %d",&n,&m);
    scanf("%d",&k);--k;
    for(j=0;j<=k;++j)
       scanf("%d ",&vec[j]);
        for(j=1;j<=m;++j)
         {
            int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            a[x][y]=z;
            a[y][x]=z;
         }
}
void roy_floyd()
{
    int i,j,k1;
    for(i=1;i<=n;++i)
     for(j=1;j<=n;++j)
     if (i!=j) if (a[i][j]==0) a[i][j]=Infinit;
      for(k1=1;k1<=n;++k1)
       for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
         if ((a[i][k1]!=Infinit) && (a[k1][j]!=Infinit))
            if (a[i][j]>a[i][k1]+a[k1][j]) a[i][j]=a[i][k1]+a[k1][j];

}
int main()
{
    reading(n,k);
    roy_floyd();
    for(i1=0;i1<=k;++i1)
      v.push_back(vec[i1]);
     do
     {
          s=a[1][v[0]]+a[n][v[k]];
          for(i1=0;i1<=k-1;++i1)
           s=s+a[v[i1]][v[i1+1]];
           if (s<minim) minim=s;
     }
     while (next_permutation(v.begin(), v.end()));
     printf("%d",minim);
    return 0;
}