zoukankan      html  css  js  c++  java
  • TSP模板

    算法大意:从一个起点出发,到达所有需要达到的点,再回到本身,求最短路

    法一:用状态压缩思想

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int n;
    struct edge{
        int x;
        int y;
    }a[20];
    int temp[20][1<<16],dis[20][20],best[1<<16];
    const int inf = 0x3f3f3f3f;
    int main()
    {
        while(~scanf("%d",&n)){
            for(int i = 0; i < n ; i++)
                scanf("%d%d",&a[i].x,&a[i].y);
            int len = 0;
            int maxn = (1<<n)-1;
            for(int i = 0 ; i < n ; i++)
                for(int j = 0; j <n ; j++)
                    dis[j][i] = dis[i][j] = ceil(sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)));
            for(int i = 0 ; i <= maxn; i++)
                best[i]= inf;
            for(int i = 0 ; i <= n ; i++)
                for(int j = 0 ; j <= maxn; j++)
                    temp[i][j] = inf;
            temp[0][1] =0;//现在为状态1,当前位置在0
            for(int i = 0 ; i <= maxn ; i++){
                for(int j = 0 ; j < n ; j++){
                    if(i&(1<<j)){
                        best[i] = min(best[i],temp[j][i]+dis[j][0]);
                        for(int k = 0 ; k < n ; k++)
                            if(!(i&(1<<k)))
                                temp[k][i|(1<<k)] = min(temp[k][i|(1<<k)],temp[j][i]+dis[j][k]);
                    }
                }
            }
            printf("%d
    ",best[maxn]);
        }
        return 0;
    }
    

      

    法二:

    上面方法复杂度也没降很多。。直接暴力2^n*n^2感觉写法简单多了

       int maxn = (1 << n) - 1;
             dp[1][0] = 0;
             for(int i = 0; i <= maxn; i++){
                 for(int j = 0; j < n; j++){
                     for(int k = 0; k < n; k++){
                         if(!((i>>k)&1))
                             dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k], dp[i][j] + d[j][k]);
                         }
                     }
                 }
             int ans = inf;
             for(int i = 0 ; i < n; i++){
                ans = min(ans, dp[maxn][i] + d[i][0]);
             }
             printf("%d
    ", ans);
    

      

  • 相关阅读:
    第二次作业——评分!
    第一次点评!
    神经网络测试:利用分块patch输入的弊端
    利用分块进行网络输入测试
    python 用filter求解素数
    英语语法
    git clone 下载出现Time out
    路由转发
    获取用户密码
    后门维持
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4463144.html
Copyright © 2011-2022 走看看