hdu 4284 Travel(壮压DP&TSP&floyd)
Travel
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2621 Accepted Submission(s): 720
PP lives in city 1, and she will start her journey from city 1. and end her journey at city 1 too.
Then follows T cases, each of which begins with three integers: the number of cities N (N <= 100) , number of roads M (M <= 5000) and her initiative money Money (Money <= 10^5) .
Then follows M lines. Each contains three integers u, v, w, which means there is a road between city u and city v and the cost is w. u and v are between 1 and N (inclusive), w <= 10^5.
Then follows a integer H (H <= 15) , which is the number of chosen cities.
Then follows H lines. Each contains three integers Num, Ci, Di, which means the i_th chosen city number and Ci, Di described above.(Ci, Di <= 10^5)
4 5 10
1 2 1
2 3 2
1 3 2
1 4 1
3 4 2
3
1 8 5
2 5 2
3 10 1
2 1 100
1 2 10000
1
2 100000 1
NO
题意:
一个人要去旅游。给你n个城市和m条道路。其中有h个城市必须在那里打工。打工的话必须办证。办证要花掉d[i]的钱币。但是有c[i]的工资。每条道路都需花费一定的钱币。告诉你他的初始钱币数。问他能否将这h个城市都工作完。
思路:
y由于h的范围比较小。可以状态压缩。考虑经过的情况直接可以用floyd求出两个城市间的最小花费。然后就是典型的TSP了。
详细见代码:
- #include<iostream>
- #include<string.h>
- #include<cstdio>
- const int INF=0x3f3f3f3f;
- using namespace std;
- int dp[105][1<<16];
- int dis[105][105];
- int C[150],D[150],id[150];
- int n,m,h,mon;
- void floyd()
- {
- for (int k=1;k<=n;k++)
- for (int i=1;i<=n;i++)
- for (int j=1;j<=n;j++)
- dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
- }
- int main()
- {
- int t,i,j,u,v,w,lim,ns,s,ans;
- scanf("%d",&t);
- while (t--)
- {
- memset(dis,0x3f,sizeof dis);
- scanf("%d%d%d",&n,&m,&mon);
- for(i=0;i<m;i++)
- {
- scanf("%d%d%d",&u,&v,&w);
- dis[u][v]=dis[v][u]=min(dis[u][v],w);//习惯性的就判重了。据说这题还真有重边
- }
- for(i=1;i<=n;i++)
- dis[i][i]=0;
- floyd();
- scanf("%d",&h);
- for(i=1;i<=h;i++)
- scanf("%d%d%d",&id[i],&C[i],&D[i]);//异常2B。开始后面把id[i]和i混为一谈了
- memset(dp,0xcf,sizeof dp);
- dp[1][0]=mon;
- for(i=1;i<=h;i++)
- {
- v=id[i];
- if(dp[1][0]>=D[i]+dis[1][v])
- {
- ns=1<<(i-1);
- dp[v][ns]=dp[1][0]-D[i]-dis[1][v]+C[i];//只有距离才用还原到原标号
- }
- }
- lim=1<<h;
- for(s=0;s<lim;s++)
- {
- for(i=1;i<=h;i++)//开始2B了。套了两个n果断超时了。
- {
- u=id[i];//其实直接考虑必须工作的城市就行了.因为最后还是会到必须到的城市
- if(dp[u][s]<0||!(s&(1<<(i-1))))//保证状态有效
- continue;
- for(j=1;j<=h;j++)
- {
- v=id[j];
- if(!(s&(1<<(j-1))))
- {
- ns=s|(1<<(j-1));
- if(dp[u][s]>=D[j]+dis[u][v])
- dp[v][ns]=max(dp[v][ns],dp[u][s]-D[j]-dis[u][v]+C[j]);
- }
- }
- }
- }
- ans=-INF;
- for(i=1;i<=h;i++)
- {
- u=id[i];
- ans=max(ans,dp[u][lim-1]-dis[u][1]);
- }
- if(ans>=0)
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }
hdu 4284 Travel(壮压DP&TSP&floyd)的更多相关文章
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- [Usaco2006 Nov]Corn Fields牧场的安排 壮压DP
看到第一眼就发觉是壮压DP 然后就三进制枚举子集吧. 这题真是壮压入门好题... 对于dp[i][j] 表示第i行,j状态下前i行的分配方案数. 那么dp[i][j]肯定是从i-1行转过来的 那么由于 ...
- POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...
- POJ3311 Hie with the Pie 【状压dp/TSP问题】
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- hdu 4284 Travel(floyd + TSP)
虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...
随机推荐
- ConcurrentHashMap放入null值报错
//ConcurrentHashMap源码: /** Implementation for put and putIfAbsent */ final V putVal(K key, V value, ...
- [Z]用subcaption包排版子图(表)与图(表)格式设置
很不错的一篇文章,可以进一步参考caption和subcaption的文档: http://www.peteryu.ca/tutorials/publishing/latex_captions
- ojective-c convert to pascal pattern
ojective-c convert to pascal pattern http://www.cnblogs.com/cnsoft/archive/2013/06/09/3128619.html C ...
- HTTP请求类
package com.paytest.util; import java.io.BufferedReader; import java.io.IOException; import java.io. ...
- ajax传递给后台数组参数方式
出自:http://blog.csdn.net/lingxyd_0/article/details/10428785 在项目上用到了批量删除与批量更改状态,前台使用了EasyUI的DataGrid,用 ...
- Bower 使用
Bower:客户端库管理工具 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 常用操作 项目初始化 库的安装 库的搜索和查看 库的更新和卸载 列出所有库 ...
- java使用POI写Excel文件
参考地址:http://www.cnblogs.com/xwdreamer/archive/2011/07/20/2296975.html 1 jar包 网上下载 2 源代码 package zjr. ...
- Linux下git使用详解1
1. git使用第一步:安装git $ sudo apt-get install git-core #ubuntu系统下使用apt-get $ yum install git-core #译者注,在r ...
- Python OrderedDict使用
一.最近最少使用实现: import collections class LRUDict(object): ''' 最近最少使用队列实现,最近使用的键值放后面 ''' def __init__(sel ...
- 143. Reorder List(List)
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...