zoj1232 Adventure of Super Mario dp+floyed
2015-08-22 17:16
211 查看
题目链接:
zoj1232
题意:
一幅无向图有n1个村庄(1~n1),n2个城堡(n1~n1+n2),它们之间有m条边,马里奥知道每条边的距离且他1s能走1单位距离
马里奥要从1号村庄走到n1+n2号城堡,他有一双可以使用k次的跑鞋,每使用一次可以从一个地方迅速到达另一个地方,但中间不能经过城堡,且两个地方的距离不能超过L
问,马里奥最少需要多少时间
题解:
首先需要两个数组dis[i][j],ok[i][j]表示i到j的最短距离和能否用跑鞋从i到j
这两个数组都可以用floyed算法求得
最后从1->n1+n2 开始dp;
dp[i][j]表示k次以内到达i所需要的最小时间
k*n^2即可得到答案
代码:
zoj1232
题意:
一幅无向图有n1个村庄(1~n1),n2个城堡(n1~n1+n2),它们之间有m条边,马里奥知道每条边的距离且他1s能走1单位距离
马里奥要从1号村庄走到n1+n2号城堡,他有一双可以使用k次的跑鞋,每使用一次可以从一个地方迅速到达另一个地方,但中间不能经过城堡,且两个地方的距离不能超过L
问,马里奥最少需要多少时间
题解:
首先需要两个数组dis[i][j],ok[i][j]表示i到j的最短距离和能否用跑鞋从i到j
这两个数组都可以用floyed算法求得
最后从1->n1+n2 开始dp;
dp[i][j]表示k次以内到达i所需要的最小时间
k*n^2即可得到答案
代码:
#include<iostream> #include<cstdio> #include<cstring> #define maxn 105 #define INF 0x3f3f3f3f using namespace std; int dis[maxn][maxn],ok[maxn][maxn]; int dp[maxn][maxn]; int n,n1,n2,K,l; void init() { n=n1+n2; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=i==j?0:INF; memset(ok,0,sizeof(ok)); } void floyed() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; if(k<=n1&&dis[i][j]<=l) ok[i][j]=1; } } } void work() { int minn,temp; for(int i=1; i<=n; i++) dp[i][0]=dis[1][i]; for(int j=1; j<=K; j++) dp[1][j]=0; for(int i=2; i<=n; i++) for(int j=1; j<=K; j++) { minn=INF; for(int k=1; k<i; k++) { if(ok[k][i]) temp=min(dp[k][j-1],dp[k][j]+dis[k][i]); else temp=dp[k][j]+dis[k][i]; if(temp<minn) minn=temp; } dp[i][j]=minn; } } int main() { // freopen("in.txt","r",stdin); int T,m,a,b,c; for(scanf("%d",&T); T--;) { scanf("%d%d%d%d%d",&n1,&n2,&m,&l,&K); init(); while(m--) { scanf("%d%d%d",&a,&b,&c); dis[a][b]=dis[b][a]=c; if(c<=l) ok[a][b]=ok[b][a]=1; } floyed(); work(); printf("%d\n",dp [K]); } }
相关文章推荐
- 小议C和C++中的const类型限定符
- 请用LinkedList模拟栈数据的集合,并测试
- 湖南省第七届大学生计算机程序设计竞赛多连块拼图
- BFS(最短路) HDOJ 4308 Saving Princess claire_
- C#自定义事件监听实现方法
- MySQL事务及隔离级别
- iOS学习笔记-Objective-C-类和对象
- PAT 1060. Are They Equal (25)
- FPGA学习
- Java实现二叉树的相关操作
- NIST SP800系列标准
- MySql 之 FIND_IN_SET 和IN
- 01.OC的概述
- Android SDK Manager下载
- 黑马程序员----JavaSE一些常用基础知识点记录-学习日记
- poj 1573 Robot Motion
- 我的Linux系统的VIMRC
- Azure中的WEB项目与Azure的MySQL连接
- 我的第一篇博客,就要开始啦
- 强制横屏