ZOJ 1232 【灵活运用FLOYD】 【图DP】
题意:
copy自http://blog.csdn.net/monkey_little/article/details/6637805
有A个村子和B个城堡,村子标号是1~A,城堡标号是A+1~B。马里奥现在位于城堡B,他要带公主回到村子1,他有一双靴子,穿上之后可以不用时间就能从一个地方飞到另外一个地方,但是穿着靴子不能穿过城堡,穿靴子的次数也不能超过 K 次,一次不能超过 L km。求从 A+B 到 1 所用的最短时间。
思路:
首先是利用FLOYD找出任何两点之间的最短路,以及这两点之间能否使用靴子。
使用靴子有两种限制,第一种是距离不能超过L,第二种是中间不能存在城堡。
第一种限制一目了然,第二种限制就要结合FLOYD枚举中间节点的地方下手,加入枚举的中间节点是城堡的话,那么无论这条路多长都不能使用靴子。
然后是图DP。
用dp[i][j]记录从第1个点到第i个点之间使用j次靴子的最短路。
状态转移方程是dp[i][j]=min(dp[k][j-1],dp[k][j]+dis[k][i]).(如果两点之间可以使用靴子的话)
这里的K需要枚举,用到的也是FLOYD里边的DP思想。
上代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int A,B,M,L,K;
int pho[][];
int dp[][];
bool canfly[][];
void FLOYD()
{
for(int k=; k<=A+B; k++)
{
for(int i=; i<=A+B; i++)
{
for(int j=; j<=A+B; j++)
{
if(pho[i][k]+pho[k][j]<pho[i][j])
{
pho[i][j]=pho[i][k]+pho[k][j]; }
if(k<=A&&pho[i][j]<=L)
{
canfly[i][j]=canfly[j][i]=;
}
}
}
}
}
void DP()
{
for(int i=; i<=K; i++)
{
dp[][i]=;
}
for(int i=; i<=A+B; i++)
{
dp[i][]=pho[][i];
}
for(int i=; i<=A+B; i++)
{
for(int j=; j<=K; j++)
{
int Min=inf;
for(int w=; w<i; w++)
{
if(canfly[w][i])
Min=min(Min,dp[w][j-]);
Min=min(Min,dp[w][j]+pho[w][i]);
}
dp[i][j]=Min;
}
}
}
int main()
{
int t;
int a,b,c;
scanf("%d",&t);
while(t--)
{
memset(canfly,,sizeof(canfly));
scanf("%d%d%d%d%d",&A,&B,&M,&L,&K);
for(int i=; i<=A+B; i++)
{
for(int j=; j<=A+B; j++)
{
pho[i][j]=inf;
}
pho[i][i]=;
}
for(int i=; i<=M; i++)
{
scanf("%d%d%d",&a,&b,&c);
pho[a][b]=pho[b][a]=c;
if(c<=L)
{
canfly[a][b]=canfly[b][a]=;
}
}
FLOYD();
DP();
printf("%d\n",dp[A+B][K]);
}
}
ZOJ 1232 【灵活运用FLOYD】 【图DP】的更多相关文章
- 【Trie图+DP】BZOJ1030[JSOI2007]-文本生成器
[题目大意] 给出单词总数和固定的文章长度M,求出至少包含其中一个单词的可能文章数量. [思路] 对于至少包含一个的类型,我们可以考虑补集.也就是等于[总的文章可能性总数-不包含任意一个单词的文章总数 ...
- Tarjan缩点+DAG图dp
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- HDU 2296 Ring ( Trie图 && DP && DP状态记录)
题意 : 给出 m 个单词,每一个单词有一个权重,如果一个字符串包含了这些单词,那么意味着这个字符串拥有了其权重,问你构成长度为 n 且权重最大的字符串是什么 ( 若有权重相同的,则输出最短且字典序最 ...
- codeforces 677D(分层图dp)
Codeforces 677D 传送门:https://codeforces.com/contest/677/problem/D 题意: 给你一个n*m的方格图,每个点有一个权值val,现在要求你从坐 ...
- ZOJ 1232 Adventure of Super Mario (Floyd + DP)
题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b.现在超级玛丽在a+b处,他的家在1处.每条路是双向的,两端地点的编号以及路的长度都已给出.路的长度和通过所需时间相等.他有一双鞋子,可 ...
- AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...
- [NOIP2016 D1T3]换教室 【floyd+概率dp】
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- zoj 3469 Food Delivery 区间dp + 提前计算费用
Time Limit: 2 Seconds Memory Limit: 65536 KB When we are focusing on solving problems, we usual ...
- ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩
HDU 5418 Victor and World Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%I64d & ...
随机推荐
- bat判断服务是否启动
sc query|find "tomcat6" && echo yes || echo nosc query|find "eventlog" & ...
- 第十三周翻译:SQL Server安全级别1:SQL Server安全性概述
SQL Server安全级别1:SQL Server安全性概述 源自:Stairway to SQL Server Security Level 1: Overview of SQL Server S ...
- hdu5739Fantasia(多校第二场1006) 割点+逆元
Fantasia Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Proble ...
- 关于MessageBox返回值
风格设置MB_OK. 此时无论点击确定还是点击X,都返回IDOK.风格设置MB_OKCANCEL,点击确认返回IDOK,点击取消和X都返回IDCANCEL.风格设置MB_YESNO,点击是返回IDYE ...
- C++:new的使用
这里先开个头,以后做详细补充个: new 分配内存失败后会返回空指针:
- 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...
- freemarker特殊字符输出
期望输出: #{fefefefwewrerwerwrrrre}${fffqqqwwwwwwwwwwwwwwww} 但是以上解析ftl时候会报错!!!!!!!!!!!! 解决办法: 方法1:使用${r& ...
- kubeadm1.14.1 安装Metrics Server
Metrics API 介绍Metrics-Server之前,必须要提一下Metrics API的概念 Metrics API相比于之前的监控采集方式(hepaster)是一种新的思路,官方希望核心指 ...
- bzoj4951 [Wf2017]Money for Nothing
题目描述 题解: 答案显然是$max((q-p)*(e-d))$ 依然先贪心. 对于工厂,我们倾向于$pi<pj,di<dj$的; 对于买家,我们倾向于$qi>qj,ei>ej ...
- 文本三剑客之grep
接受正则表达式,按行匹配,将会过滤出匹配的所有行 格式: grep [OPTION]... PATTERN [FILE]... 可以看出,grep后可以同时接多个文件 选项OPTIO ...