Travelling(hdu3001)
Travelling
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5762 Accepted Submission(s): 1857
Sample Output
1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<iostream>
5 #include<stdlib.h>
6 #include<queue>
7 #include<stack>
8 typedef long long ll;
9 long long ma[20][20];
10 long long dp[60000][20];//开pow(3,11);
11 long long san[60000][20];
12 int a[60000];//记录状态是否都至少经过一次
13 const long long N=1e9;
14 using namespace std;
15 int main(void)
16 {
17 long long n,i,j,k,p,q;
18 long long x,y,v;
19 memset(san,0,sizeof(san));
20 for(i=0; i<60000; i++)
21 {
22 ll vv=i;
23 int flag=0;
24 int f=0;
25 while(vv)
26 {
27 san[i][f++]=vv%3;
28 if(vv%3==0)
29 {
30 flag=1;
31 }
32 vv/=3;
33
34 }
35 if(flag==0) a[i]=1;
36 }//把状态用三进制表示
37 while(scanf("%lld %lld",&p,&q)!=EOF)
38 {
39 for(i=0; i<20; i++)
40 for(j=0; j<20; j++)
41 ma[i][j]=N;
42 for(i=0; i<60000; i++)
43 for(j=0; j<20; j++)
44 dp[i][j]=N;
45 for(i=0; i<q; i++)
46 {
47 scanf("%lld %lld %lld",&x,&y,&k);
48 ma[x-1][y-1]=min(k,ma[x-1][y-1]);
49 ma[y-1][x-1]=min(k,ma[x-1][y-1]);
50 }
51 int xx=1;
52 for(i=0; i<p; i++)
53 {
54 dp[xx][i]=0;
55 xx*=3;
56 }//出发点初始化置0。
57 int yy=1;
58 for(i=0; i<p; i++)
59 {
60 yy*=3;
61 }
62 for(i=1; i<yy; i++)
63 {
64 ll pp=i;
65 for(j=0; j<p; j++)
66 {
67 if(san[pp][j]>0)//判断当前状态是否经过这点
68 {
69 int uu=0;
70 int rr=1;
71 for(v=0; v<p; v++)
72 {
73 int vp=san[pp][v];
74 if(v==j)
75 {
76 vp--;
77 }
78 vp*=rr;
79 rr*=3;
80 uu+=vp;
81 }
82 for(v=0; v<p; v++)
83 {
84 if(san[uu][v]>0)//判断上个状态是否经过上个状态的结束点
85 {
86 dp[i][j]=min(dp[i][j],dp[uu][v]+ma[v][j]);
87
88 }
89 }
90 }
91 }
92
93 }
94 long long minn=N;
95 int tu=0;
96 for(i=0; i<p; i++)
97 {
98 tu*=3;
99 tu+=1;
100 }
101 for(i=tu; i<yy; i++)//至少经过每个点一次中取最小
102 {
103 if(a[i])
104 {
105 for(j=0; j<p; j++)
106 {
107 if(dp[i][j]<minn)
108 {
109 minn=dp[i][j];
110 }
111
112 }
113 }
114
115 }
116
117 if(minn==N)
118 {
119 printf("-1\n");
120 }
121 else
122 printf("%lld\n",minn);
123 }
124 return 0;
125 }
Travelling(hdu3001)的更多相关文章
- HDU-3001 Travelling
http://acm.hdu.edu.cn/showproblem.php?pid=3001 从任何一个点出发,去到达所有的点,但每个点只能到达2次,使用的经费最小.三进制 Travelling Ti ...
- HDU3001 Travelling
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- HDU3001 Travelling —— 状压DP(三进制)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/ ...
- [状压dp]HDU3001 Travelling
题意: 走n个城市, m条路, 起点任意, 每个城市走不超过两次, 求最小花费, 不能走输出-1. $1\le n\le 10$ 分析: 每个城市的拜访次数为0 1 2, 所以三进制状压, 先预处理1 ...
- Travelling(HDU3001+状压dp+三进制+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...
- HDU3001 Travelling 状压DP
哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.ne ...
- HDU3001 Travelling (状压DP)
题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况). 因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的. 边界条件:dp[tri ...
- 【状压dp】Travelling
[hdu3001]Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- ACM: 限时训练题解- Travelling Salesman-最小生成树
Travelling Salesman After leaving Yemen, Bahosain now works as a salesman in Jordan. He spends mos ...
随机推荐
- UE4之Slate: App启动与最外层Runtime结构
UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...
- 【模板】有源汇有上下界最大流(网络流)/ZOJ3229
先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...
- LeetCode一维数组的动态和
一维数组的动态和 题目描述 给你一个数组 nums.数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]...nums[i]). 请返回 nums 的动态和. 示例 1: ...
- 学习java 7.4
学习内容:遍历字符串要点:for(int i = 0;i < line.length();i++) { System.out.println(line.chatAt(i)); } 字符串拼接: ...
- Linux基础命令---nfsstat显示nfs信息
nfsstat nfsstat指令用来显示nfs客户端和服务器的活动信息. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 nfsstat ...
- mybatis中返回自动生成的id
当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢. 在mysql数据中我们可以在insert下添加一个selectKey用以指定返回的类型和值: ...
- 【Office】【Excel】将多个工作表合为一个工作表
在工作表中按下alt+F11打开vba编辑窗口,在菜单栏中选择[插入]=>[模板],将下面的代码粘贴过去,然后运行即可 点击查看代码 Sub 合并当前工作簿下的所有工作表() On Error ...
- 4、Linux下安装tomcat
Linux系统下安装tomcat 一.安装JDK 安装Tomcat之前需要安装JDk,安装JDk请参考:JDK安装. 二.Linux安装Tomcat 1.官网上下载Tomcat Apach ...
- DevOps的分与合
一.抽象的 DevOps DevOps 是使软件开发和 IT 团队之间的流程自动化的一组实践,以便他们可以更快,更可靠地构建,测试和发布软件.DevOps 的概念建立在建立团队之间协作文化的基础上,这 ...
- 转:ios delegate
首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事.也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法. 其次,我简单的总结了 ...