您的位置:首页 > 其它

最佳旅游路线

2018-01-24 13:19 204 查看
链接: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: