Cod sursa(job #1104167)

Utilizator mcip1977Muresan Ciprian mcip1977 Data 10 februarie 2014 15:35:38
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int maxx=100000;
int a[2001][2001],k,n,m,p[2001],x[2001],l[2001],dmin=1000000000;
void citire()
{
    int i,j,x,c;
    fin>>n>>m>>k;
    for(i=1;i<=k;i++) fin>>l[i];
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            a[i][j]=a[j][i]=maxx;
    for(x=1;x<=m;x++)
    {  fin>>i>>j>>c;
       a[i][j]=c;
       a[j][i]=c;
    }
}

void rf()
{
    int i,j,k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(i!=j)
                    if(a[i][j]>a[i][k]+a[k][j])
                        a[i][j]=a[i][k]+a[k][j];
}

void calcul()
{
    int dist=a[1][l[x[1]]],i;
    for(i=2;i<=k;i++)
        dist=dist+a[l[x[i-1]]][l[x[i]]];
    dist=dist+a[l[x[k]]][n];
    if(dist<dmin) dmin=dist;
}

void perm(int n, int k)
{  for(int i=1;i<=n;i++)
     if(!p[i])
        { x[k]=i;
          p[i]=1;
          if(k==n) calcul();
          else perm(n,k+1);
          p[i]=0;
          }
}


void inter (int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}
void permute(int i, int n)
{
  for (int j = i; j <= n; j++)
       {
          swap(x[i], x[j]);
          if(i==n) calcul();
          else permute(i+1, n);
          swap(x[i], x[j]);
       }
}

int main()
{
    citire();
    rf();
    for(int i=1;i<=k;i++) x[i]=k;
    //if(k>0) perm(k,1);
    //else dmin=a[1][n];
    if(k>0) permute(1,k);
    else dmin=a[1][n];
    fout<<dmin;
    fin.close();
    fout.close();
    return 0;
}