• ZQUOJ 1964 Hamilton回路(状压dp)


    题目大意:

      给出一个n个顶点的无向图,请寻找一条从顶点0出发,遍历其余顶点一次且仅一次、最后回到顶点0的回路——即Hamilton回路。

    解题报告:

      状压dp...

    AC代码:

     1 #include<bits/stdc++.h>
     2 #define numm ch-48
     3 #define pd putchar(' ')
     4 #define pn putchar('
    ')
     5 #define pb push_back
     6 #define fi first
     7 #define se second
     8 #define fre1 freopen("1.txt","r",stdin)
     9 #define fre2 freopen("3.txt","w",stdout)
    10 #define bug cout<<"*******************"<<endl;
    11 #define debug(args...) cout<<#args<<"->"<<args<<"
    ";
    12 using namespace std;
    13 template <typename T>
    14 void read(T &res) {
    15     bool flag=false;char ch;
    16     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
    17     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
    18     flag&&(res=-res);
    19 }
    20 template <typename T>
    21 void write(T x) {
    22     if(x<0) putchar('-'),x=-x;
    23     if(x>9) write(x/10);
    24     putchar(x%10+'0');
    25 }
    26 typedef long long ll;
    27 typedef unsigned long long ull;
    28 const int maxn=22;
    29 const int maxm=505;
    30 const int mod=1e9+7;
    31 const int inv2=500000004;
    32 const int inf=0x3f3f3f3f;
    33 const ll INF=0x3f3f3f3f3f3f3f3f;
    34 const int N=32;
    35 int a[maxn][maxn];
    36 int dp[maxn][1<<maxn];
    37 int n,m;
    38 int get_hamilton(int n) {
    39     for(int i=0;i<n;i++)
    40         for(int j=0;j<(1<<n);j++)
    41             dp[i][j]=inf;
    42     for(int i=0;i<n;i++) ///从i出发,且中途不经过i
    43         dp[i][0]=a[i][0];
    44     for(int s=1;s<(1<<n);s++)
    45         for(int i=0;i<n;i++)
    46             if(!(s>>i&1))
    47             for(int j=0;j<n;j++)
    48                 if(a[i][j]!=inf&&(s>>j&1))
    49                     dp[i][s]=dp[i][s]<(dp[j][s^(1<<j)]+a[i][j])?dp[i][s]:(dp[j][s^(1<<j)]+a[i][j]);
    50     return dp[0][(1<<n)-2];
    51 }
    52 int main()
    53 {
    54 //    #define local
    55     #ifdef local
    56         fre1;
    57         fre2;
    58     #endif // local
    59     while(scanf("%d%d",&n,&m)!=EOF) {
    60         for(int i=0;i<n;i++)
    61             for(int j=0;j<n;j++)
    62                 a[i][j]=inf;
    63         for(int i=1;i<=m;i++) {
    64             int u,v,w;
    65             read(u),read(v),read(w);
    66             a[u][v]=a[u][v]<w?a[u][v]:w;
    67             a[v][u]=a[v][u]<w?a[v][u]:w;
    68         }
    69         int ans=get_hamilton(n);
    70         if(ans==inf) puts("no Hamilton circuit");
    71         else write(ans),pn;
    72     }
    73     return 0;
    74 }
    代码在这里!
  • 相关阅读:
    Java下的tinylog日志打印
    rmi的调用
    linux下hex转ascii
    CSP攻略
    ThinkPHP5代码执行的简单分析
    MySQL UDF(User Defined Function)提权
    与邮件协议相关的端口
    常见哈希算法的密文格式
    ThinkPHP 5.0.x 反序列化漏洞 PoC
    Tomcat AJP协议文件包含漏洞(CVE-2020-1938)
  • 原文地址:https://www.cnblogs.com/wuliking/p/11420781.html
Copyright © 2020-2023  润新知