Cod sursa(job #1623143)

Utilizator ris99Istrate Ruxandra ris99 Data 1 martie 2016 17:24:55
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#define inf 16830
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int c[201][201],d[201],use[201],n,m,k,c1[201],nr,d1[20],x[20];
void citire()
{ int i,j,x,y,cost;
  f>>n>>m;
  f>>k;
  for(i=1;i<=k;i++)
  f>>c1[i];
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  if(i==j) c[i][j]=0;
  else c[i][j]=inf;
  for(i=1;i<=m;i++)
  {f>>x>>y>>cost;
   c[x][y]=cost;
   c[y][x]=cost;
  }
}
void dijkstra()
{int x,min1,i;
 for(i=1;i<=n;i++) d[i]=inf;
 d[1]=0;
 while(1)
 {min1=inf;
 for(i=1;i<=n;i++)
 if(!use[i]&&d[i]<min1)
 {min1=d[i];
  x=i;
 }
 if(min1==inf) break;
 use[x]=1;
 for(i=1;i<=n;i++)
 if(d[x]+c[x][i]<d[i])
 {d[i]=d[x]+c[x][i];
  //t[i]=x;
 }
}
}
void floyd()
{for (int k=1;k<=n;k++)
 for (int i=1;i<=n;i++)
 for(int j=1;j<=n;j++)
 if(c[i][k]+c[k][j]<c[i][j]) c[i][j]=c[i][k]+c[k][j];

}
int valid (int k1)
{ for(int i=1;i<k1;i++)
  if(x[k1]==x[i]) return 0;
   return 1;
}
void suma()
{ int s=c[1][c1[x[1]]];

  for(int i=2;i<=k;i++)
  s=s+c[c1[x[i-1]]][c1[x[i]]];
  s=s+c[c1[x[k]]][n];
  d1[++nr]=s;
}
void back(int k1)
{ for(int i=1;i<=k;i++)
{ x[k1]=i;
  if(valid(k1))
  if(k1==k) suma ();
  else back(k1+1);
}
}
int main()
{ int min1=inf;
  citire();
  if(k==0)
  {dijkstra();
  g<<d[n]<<endl;
  }
  else
  { floyd();
    back(1);
    for(int i=1;i<=nr;i++)
    if(min1>d1[i]) min1=d1[i];
    g<<min1;
  }

    return 0;
}