弗洛伊德与哈密顿结合;**最小路径与状态压缩(动态规划)
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long LL;
const int N=201;
int road[N][N];
int p[N];
int dp[1<<15][N];
int n,m,r;

void floyd()
{
   for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      for(int k=1;k<=n;k++)
      road[i][j]=min(road[i][j],road[i][k]+road[k][j]);
}
int main()
{
   cin>>n>>m>>r;
   for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
     if(i==j) road[i][j]=0;
     else
     road[i][j]=0x3f3f3f3f;
   while(m--)
   { 
      int a,b,c;
      cin>>a>>b>>c;
      road[a][b]=road[b][a]=c;
   }
   floyd();
   for(int i=0;i<r;i++)
   cin>>p[i];
   memset(dp,0x3f,sizeof(dp));
   for(int j=0;j<r;j++)
   dp[1<<j][j]=0;
   for(int i=0;i<1<<r;i++)
     for(int j=0;j<r;j++)
     if(i>>j&1)
     {
        for(int k=0;k<r;k++)
        if((i-(1<<j))>>k&1)
        dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+road[p[k]][p[j]];
     }
     int res=0x3f3f3f3f;
     for(int i=0;i<r;i++)
     ans=min(ans,dp[(1<<r)-1][i]);
     cout<<ans<<endl;
   return 0;
}