Cod sursa(job #1535020)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 24 noiembrie 2015 11:19:51
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,i,j,v[205],k,rez,o;
bool ok;
int xx,y,c,a[2005][2005];
int x[210],min1;
int valid(int k)
{
    int i;
    for(i=1;i<k;i++)
      if(x[i]==x[k])
        return 0;
    return 1;
}
int main()
{
    f>>n>>m;
    f>>o;
    for(i=1;i<=o;i++)
      f>>v[i];
    for(i=1;i<=m;i++)
    {
        f>>xx>>y>>c;
        a[xx][y]=a[y][xx]=c;
    }
    for(k=1;k<=n;k++)
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          if(a[i][k]!=0&&a[k][j]!=0&&(a[i][j]>a[i][k]+a[k][j]||a[i][j]==0)&&i!=j)
            a[i][j]=a[j][i]=a[i][k]+a[k][j];
    if(o==0)
      g<<a[1][n];
    else if(o==1)
      g<<a[1][v[1]]+a[v[1]][n];
    else
    {
        min1=200000;
        i=1;
        do
        {
            do
            {
                x[i]++;
                if(x[i]>o)
                {
                    x[i]=0;
                    i--;
                }
                else if(valid(i))
                  i++;
            }while(i<=o&&i>0);
            if(i>o)
            {
                rez=0;
                rez=a[1][v[x[1]]];
                for(i=2;i<=o;i++)
                  rez+=a[v[x[i-1]]][v[x[i]]];
                min1=min(min1,rez);
                i=o;
            }
        }while(i>0);
        g<<min1;
    }
    return 0;
}