Travel

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2621    Accepted Submission(s): 720

Problem Description
PP loves travel. Her dream is to travel around country A which consists of N cities and M roads connecting them. PP has measured the money each road costs. But she still has one more problem: she doesn't have enough money. So she must work during her travel. She has chosen some cities that she must visit and stay to work. In City_i she can do some work to earn Ci money, but before that she has to pay Di money to get the work license. She can't work in that city if she doesn't get the license but she can go through the city without license. In each chosen city, PP can only earn money and get license once. In other cities, she will not earn or pay money so that you can consider Ci=Di=0. Please help her make a plan to visit all chosen cities and get license in all of them under all rules above.

PP lives in city 1, and she will start her journey from city 1. and end her journey at city 1 too.

 
Input
The first line of input consists of one integer T which means T cases will follow.

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)

 
Output
If PP can visit all chosen cities and get all licenses, output "YES", otherwise output "NO".

 
Sample Input
2
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
 
Sample Output
YES
NO
 
Source
 
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  
4268 
4269 
4270 
4271 
4272 
 

题意:

一个人要去旅游。给你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)的更多相关文章

  1. HDU 4284Travel(状压DP)

    HDU 4284    Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...

  2. [Usaco2006 Nov]Corn Fields牧场的安排 壮压DP

    看到第一眼就发觉是壮压DP 然后就三进制枚举子集吧. 这题真是壮压入门好题... 对于dp[i][j] 表示第i行,j状态下前i行的分配方案数. 那么dp[i][j]肯定是从i-1行转过来的 那么由于 ...

  3. POJ 2686 Traveling by Stagecoach 壮压DP

    大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...

  4. 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 ...

  5. Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)

    题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...

  6. POJ3311 Hie with the Pie 【状压dp/TSP问题】

    题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total ...

  7. 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表示 ...

  8. HDU 3001 Travelling ——状压DP

    [题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...

  9. hdu 4284 Travel(floyd + TSP)

    虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...

随机推荐

  1. 第6章Zabbix分布式监控

    Zabbix是一个分布式的监控系统.分布式监控适合跨机房.跨地域的网络监控.从多个Proxy收集数据,而每个Proxy可以采集多个设备的数据,从而轻松地构建分布式监控系统. ZabbixProxy可以 ...

  2. c#中的序列化

    1.对象的序列化 NET支持对象序列化有以下几种方式:二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serializ ...

  3. python学习——练习题(8)

    """ 题目:输出 9*9 乘法口诀表. """ def answer1(): """ 自己用最普通的双重循环 ...

  4. 关于电机驱动扩展板 L293D 马达板Arduino

    注意端口3,4,5,6,7,8,9,10,11,12会被占用(板子上的pin口). 通过 MS_DCMotor motor(4); 中的4指的是4号电机,同理还有1-3号电机.不是pin口   舵机用 ...

  5. leetcode671

    class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { V. ...

  6. Directshow 判断音视频设备是否被占用<转>

    直接上代码吧: 代码是参考网上大神分享的,在原基础上做了些修改(只检测视频设备): int DeviceIsBusy(char *videoName) { //输入设备的音视频名称 HRESULT h ...

  7. java之api讲解

    1:数值运算 Java提供了java.lang.Math类支持数值运算 看文档 java.lang叫做核心语言包,里面包含的是Java中最基础的一些类,此包中的类,可以使用,不用import该包 举例 ...

  8. 使用net.sf.fjep.fatjar插件将第三方JAR包打包进自已的JAR包中

    一般单个工程,在没有应用别人的jar包时导出为jar很简单,只要设置一个Main-Class就行了,也就是选择程序入口(main所在类).但是涉及到了数据库或需要用到第三方的JAR,就需要用到相应的数 ...

  9. fsync性能问题

    最近在测试种发现程序里调用fsync刷文件到磁盘时,开销只有几百微秒,于是对fsync相关机制进行了一番调查. 磁盘(或RAID卡)自身通常会有硬件缓存机制,对于写操作,有write back和wri ...

  10. 【LA3713 训练指南】宇航员分组 【2-sat】

    题意 有A,B,C三个任务要分配给n个宇航员,其中每个宇航员恰好要分配一个任务.设所有n个宇航员的平均年龄为x,只有年龄大于或等于x的宇航员才能分配任务A:只有年龄严格小于x的宇航员才能分配任务B,而 ...