zoukankan      html  css  js  c++  java
  • hdu_5418_Victor and World(状压DP+Floyd)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418

    题意:给你n个点,和一些边,找一条路径经过全部的点,并回到起点,问最小的花费是多少,

    题解:m<=1e5,n<16,说明有多边,需要处理一下,处理完用floyd跑一下,然后进行状态压缩dp。


     1 #include<cstdio>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 inline void up(int &x,int y){if(x>y)x=y;}
     4 
     5 int dp[1<<16][17],g[17][17],inf=1<<29,n,m,t,u,v,c,end,ans;
     6 
     7 int main(){
     8     scanf("%d",&t);
     9     while(t--){
    10         scanf("%d%d",&n,&m),end=(1<<n)-1,ans=inf;
    11         F(i,1,n)F(j,1,n)g[i][j]=(i==j?0:inf);
    12         F(i,1,m)scanf("%d%d%d",&u,&v,&c),up(g[u][v],c),up(g[v][u],c);
    13         F(k,1,n)F(i,1,n)F(j,1,n)up(g[i][j],g[i][k]+g[k][j]);//Floyd
    14         F(i,1,end)F(j,1,n)dp[i][j]=inf;
    15         dp[1][1]=0;
    16         F(i,1,end)F(j,1,n)if(dp[i][j]!=inf)F(k,2,n)
    17         if(k==j||i&1<<k-1)continue;
    18         else up(dp[i|1<<k-1][k],dp[i][j]+g[j][k]);
    19         F(i,1,n)up(ans,dp[end][i]+g[i][1]);
    20         printf("%d
    ",ans);
    21     }
    22     return 0;
    23 }
    View Code



  • 相关阅读:
    关于运行和调试的困惑
    初识函数
    Php的基本语法
    Apache的安装
    php的初步了解
    线程笔记
    Matlab笔记
    matlab取模与取余
    DialogFragment学习笔记
    MVP学习笔记——参考Google官方demo
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696101.html
Copyright © 2011-2022 走看看