链接:http://icpc.njust.edu.cn/Problem/Local/1429/点击打开链接
答案错误!!!
/* 思路: 1、先用Floyd求出任意两点之间的距离 2、用DFS走过所有可能的路径 3、取最小值 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 999999 int d[5002][5002]; int vist[5002];//想要访问的城市,0表示已经访问过,其他数字则表示未被访问过 int n,x; int m; int ans=99999999; void read() { cin>>n>>x; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(i==j) { d[i][j]=0; continue; } d[i][j]=INF; } int a,b,value; for(int i=0; i<n-1; i++) { cin>>a>>b>>value; d[a][b]=value; d[b][a]=value; } cin>>m; memset(vist,0,sizeof(vist)); for(int i=0; i<m; i++) { cin>>vist[i]; } } void floyd()//求任意两点之间的距离 { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { d[i][j]=min(d[i][j],d[i][k]+d[k][j]); d[j][i]=d[i][j]; } } //DFS搜索所有情况 void DFS(int start,int sum,int ceng) { for(int i=0; i<m; i++) { if(vist[i]!=0) { int tmp_index=i; int tmp_value=vist[i]; vist[i]=0; //cout<<"访问"<<tmp_value<<"结点"<<endl; if(ceng==m-1)//输出 { //cout<<"层数为"<<m<<endl; //cout<<"递归结果="<<sum+d[start][tmp_value]<<endl; //cout<<"_________________"<<endl<<endl; ans=min(ans,sum+d[start][tmp_value]); } else//继续递归 DFS(tmp_value,sum+d[start][tmp_value],ceng+1); //将已经改变的vist重置为以前的状态 vist[tmp_index]=tmp_value; } } } int main() { read(); floyd(); DFS(x,0,0); cout<<ans<<endl; return 0; }