zoukankan      html  css  js  c++  java
  • 旅行商问题(深度优先搜索)

    输入:一个整数n,接下来有n*n的矩形,代表两个城市之间的路程花费,每两个城市之间的花费不超过10000.

    输出:一个整数,代表从1号城市把所有景点旅游一遍且回到1号城市的最小花费。

    样例输入:

    4

    0 1 1 1

    1 0 2 1

    5 5 0 6

    1 1 3 0

    样例输出:

    8

    思考:

    1.搜完所有城市即代表一次深度优先搜索,再加上从终点返回到1号城市的花费即一次完整的花费费用。所以每次深搜结束(搜完所有城市)代表一种花费结果。记录所有深搜中的最小花费即可。

    2在每次深搜过程中标记已经到达的城市,继续搜索还未到达的城市,一次深搜结束后,将标记清除。进行下次深搜,从而得到不同的花费结果。

    例如:四个城市1,2,3,4.

    搜索方案:

    1->2->3->4、1->2->4->3、1->3>2->4、1->3->4->2、1->4->2->3、1->4->3->2 ......

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int n;
     5 int ans=100000000;
     6 int G[100][100];
     7 bool vis[100]={0};
     8 void dfs(int u,int cnt,int sum){
     9     //最优性剪枝:在一次深搜过程中费用sum>当前走完所有路程所需的费用ans,
    10     //因此sum肯定不是最小值,不用在向下层搜索了,函数返回继续寻找另一个方案。
    11     if(sum>ans){
    12         return;
    13     }
    14     if(cnt==n){
    15         ans=min(ans,sum+G[u][1]);
    16     }
    17     vis[u]=true;//标记本层递归已搜索过
    18     for(int i=1;i<=n;i++){
    19         if(!vis[i]){
    20             dfs(i,cnt+1,sum+G[u][i]);
    21         }
    22     }
    23     vis[u]=false;//一次深搜完成后清除标记
    24 }
    25 int main()
    26 {
    27     cin>>n;
    28     for(int i=1;i<=n;i++){
    29         for(int j=1;j<=n;j++){
    30             cin>>G[i][j];
    31         }
    32     }
    33     dfs(1,1,0);
    34     cout<<ans<<endl;
    35     return 0;
    36 }
  • 相关阅读:
    最短路
    P2863 [USACO06JAN]牛的舞会The Cow Prom
    牛客小白月赛12
    牛客练习赛41
    求余
    dreamstart 的催促
    deepin安装tesseract出错,tesserocr.cpp:653:10: fatal error: leptonica/allheaders.h: 没有那个文件或目录
    自动抽屉 + 点赞 + 取消赞
    爬取汽车之家
    css垂直居中和水平居中
  • 原文地址:https://www.cnblogs.com/mld-code-life/p/12398988.html
Copyright © 2011-2022 走看看