最佳旅游路线
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;
}
答案错误!!!
/*
思路:
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;
}
相关文章推荐
- NOI1994 最佳旅游路线 解题报告
- 最佳旅游路线
- 最佳旅游路线
- 游武大 登临珞珈——探武大旅游最佳路线
- Cpp环境【NOI1994】【Vijos3266】最佳旅游路线
- Adobe Flex最佳学习路线
- Adobe Flex最佳学习路线
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
- Android开发最佳学习路线图
- Adobe Flex最佳学习路线
- 贪心法:最佳浏览路线问题
- Adobe Flex最佳学习路线
- 最佳浏览路线问题 算法设计
- 【最大子区间和】旅游路线(travel.pas/c/cpp)
- 贪心法:最佳浏览路线问题
- 太白山北坡旅游路线登顶攻略
- 诛仙手游-情缘高攻路线是低道法的最佳选择 (2)
- 最佳java学习路线
- 最佳浏览路线问题
- 一篇文章一张思维导图看懂Android学习最佳路线