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. 学习java 7.28

    学习内容: Applet Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java ...

  2. Java——数组的定义与使用

    数组的定义与使用 1.数组的基本概念 (1)数组的动态初始化: 数组首先先开辟内存空间,而后再使用索引进行内容的设置,这种定义数组的方式称为动态初始化 数组是引用数据类型,存在有内存分配问题.在使用前 ...

  3. 【Linux】【Services】【SaaS】Spinnaker

    1. 简介 1.1. 说明: Spinnaker 是 Netflix 的开源项目,是一个持续交付平台,它定位于将产品快速且持续的部署到多种云平台上.Spinnaker 通过将发布和各个云平台解耦,来将 ...

  4. d3基础入门一-选集、数据绑定等核心概念

    引入D3 D3下载,本文下载时的版本为6.5.0 mkdir d3.6.5.0 unzip --help unzip d3.zip -d d3.6.5.0/ ls d3.6.5.0/ API.md C ...

  5. 结合redis缓存的方式,查询和展示分类信息

    package cn.itcast.travel.service.impl;import cn.itcast.travel.dao.CategoryDao;import cn.itcast.trave ...

  6. 【C/C++】金币

    做了一下去年的题目,今年看起来就没这么难了 从上到下的可以从下到上考虑,会简单很多,dp入门 题目 金币 小招在玩一款游戏,在一个N层高的金字塔上,以金字塔顶为第一层,第i层有i个落点,每个落点有若干 ...

  7. NSData NSDate NSString NSArray NSDictionary 相互转化

    //    NSData  NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; ...

  8. 图数据库HugeGraph:HugeGraph-Hubble基于Web的可视化图管理初体验

    原创/朱季谦 一.HugeGraph-Hubble简介 关于HugeGraph,官方资料是这样介绍的,它是一款易用.高效.通用的开源图数据库系统(Graph Database), 实现了 Apache ...

  9. 统计函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业! 谢谢 下载地址:https://officecommunity- ...

  10. Spring5 概述及Spring IOC学习

    Spring Framework 5 1. Spring框架 1.1 Spring框架概述 1.2 主要内容 Spring框架是一个开源的JavaEE的应用程序 主要核心是 IOC(控制反转)和AOP ...