Travelling

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5762    Accepted Submission(s): 1857

Problem Description
After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being his start station because superman can bring him to any city at first but only once.), and of course there are m roads here,following a fee as usual.But Mr Acmer gets bored so easily that he doesn't want to visit a city more than twice!And he is so mean that he wants to minimize the total fee!He is lazy you see.So he turns to you for help.
 
Input
There are several test cases,the first line is two intergers n(1<=n<=10) and m,which means he needs to visit n cities and there are m roads he can choose,then m lines follow,each line will include three intergers a,b and c(1<=a,b<=n),means there is a road between a and b and the cost is of course c.Input to the End Of File.
 
Output
Output the minimum fee that he should pay,or -1 if he can't find such a route.
 
Sample Input
2 1
1 2 100
3 2
1 2 40
2 3 50
3 3
1 2 3
1 3 4
2 3 10

Sample Output

100
90
7
题意:有N个城市,一个人要 经过每个点,且经过每个点不超过2次。求最少的路费。可以从任意一个点开始。
思路:TSP,这个是三进制的状态压缩,因为过每个点要求不超过两次,其余dp的思路和TSP二进制差不多,可以说一样。
dp[i][j]表示在状态i下以j点结束的所要的最小费用。 dp[i][j]=min(dp[i][j],dp[cc][v]+ma[v][j]);cc,表示i的上一个状态。
代码:
  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)的更多相关文章

  1. HDU-3001 Travelling

    http://acm.hdu.edu.cn/showproblem.php?pid=3001 从任何一个点出发,去到达所有的点,但每个点只能到达2次,使用的经费最小.三进制 Travelling Ti ...

  2. HDU3001 Travelling

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  3. HDU3001 Travelling —— 状压DP(三进制)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/ ...

  4. [状压dp]HDU3001 Travelling

    题意: 走n个城市, m条路, 起点任意, 每个城市走不超过两次, 求最小花费, 不能走输出-1. $1\le n\le 10$ 分析: 每个城市的拜访次数为0 1 2, 所以三进制状压, 先预处理1 ...

  5. Travelling(HDU3001+状压dp+三进制+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...

  6. HDU3001 Travelling 状压DP

    哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.ne ...

  7. HDU3001 Travelling (状压DP)

    题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况). 因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的. 边界条件:dp[tri ...

  8. 【状压dp】Travelling

    [hdu3001]Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. ACM: 限时训练题解- Travelling Salesman-最小生成树

    Travelling Salesman   After leaving Yemen, Bahosain now works as a salesman in Jordan. He spends mos ...

随机推荐

  1. 『与善仁』Appium基础 — 19、元素定位工具(三)

    目录 1.Chrome Inspect介绍 2.Chrome Inspect打开方式 3.Chrome Inspect工具的使用 (1)Chrome Inspect工作前提 (2)Chrome Ins ...

  2. 『学了就忘』Linux文件系统管理 — 66、通过图形界面进行LVM分区

    目录 1.选择自定义分区 2.分配boot分区 3.创建LVM物理卷 4.生成卷组 5.创建逻辑卷 6.格式化安装 我们先用新安装Linux系统时的图形化界面,来演示一下LVM逻辑卷如何进行分区. 提 ...

  3. idea 启动debug的时候throw new ClassNotFoundException(name)

    idea 启动debug的时候throw new ClassNotFoundException(name) 启动debug就跳转到此界面 解决办法 这个方法只是忽略了抛异常的点,并没有真正解决问题.后 ...

  4. Spark集群环境搭建——服务器环境初始化

    Spark也是属于Hadoop生态圈的一部分,需要用到Hadoop框架里的HDFS存储和YARN调度,可以用Spark来替换MR做分布式计算引擎. 接下来,讲解一下spark集群环境的搭建部署. 一. ...

  5. 淘宝、网易移动端 px 转换 rem 原理,Vue-cli 实现 px 转换 rem

       在过去的一段时间里面一直在使用Vue配合 lib-flexible和px2rem-loader配合做移动端的网页适配.秉着求知的思想,今天决定对他的原理进行分析.目前网上比较主流使用的就是淘宝方 ...

  6. 栈常考应用之括号匹(C++)

    思路在注释里.还是使用链栈的API,为啥使用链栈呢,因为喜欢链栈. //header.h #pragma once #include<iostream> using namespace s ...

  7. C++ 成绩排名

    1004 成绩排名 (20分)   读入 n(>)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 ...

  8. Output of C++ Program | Set 4

    Difficulty Level: Rookie Predict the output of below C++ programs. Question 1 1 #include<iostream ...

  9. 接口测试 python+PyCharm 环境搭建

    1.配置Python环境变量 a:我的电脑->属性->高级系统设置->环境变量->系统变量中的PATH变量. 变量名:PATH      修改变量值为:;C:\Python27 ...

  10. Spring Boot中使用Dubbo

    高并发下Redis会出现的问题: 缓存穿透 缓存雪崩 热点缓存 一.定义commons工程11-dubboCommons (1) 创建工程 创建Maven的Java工程,并命名为11-dubboCom ...