最佳旅游路线

链接: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;

}



猜你喜欢

转载自blog.csdn.net/qq_33614902/article/details/79149640
今日推荐