题目大意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径。但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄。这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在村庄内部可使用。另外,在城市或村庄内部的时间不计。

题目分析:在城市内部不可使用但在村庄内部可使用的意思就是使用这种工具可以穿过多个村庄(如果长度允许)但不可穿过多个城市,即在使用这种工具的始末点之间可以有多个村庄但不可以有城市,无论始末点是什么。这样,可以先处理出任意两个城市或村庄之间的最短距离(中间不允许经过城市),然后再dijkstra。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a))
# define CLL(a,b,n) fill(a,a+n,b) const int INF=1<<30;
struct Node
{
int u,k;
Node(int _u,int _k):u(_u),k(_k){}
};
int n,m,A,B,L,K,d[105][12],vis[105][12],G[105][105]; int dijkstra()
{
REP(i,0,n) REP(j,0,K+1) d[i][j]=INF;
CL(vis,0);
queue<Node>q;
d[n-1][K]=0;
vis[n-1][K]=1;
q.push(Node(n-1,K));
while(!q.empty())
{
Node top=q.front();
q.pop();
int u=top.u,k=top.k;
REP(v,0,n){ if(G[u][v]==INF||v==u) continue;
if(d[v][k]>d[u][k]+G[u][v]){
d[v][k]=d[u][k]+G[u][v];
if(!vis[v][k]){
vis[v][k]=1;
q.push(Node(v,k));
}
}
if(k>0&&L>=G[u][v]&&d[v][k-1]>d[u][k]){
d[v][k-1]=d[u][k];
if(!vis[v][k-1]){
vis[v][k-1]=1;
q.push(Node(v,k-1));
}
}
}
vis[u][k]=0;
}
int ans=INF;
REP(i,0,K+1) ans=min(ans,d[0][i]);
return ans;
} void floyd()
{
REP(k,0,A) REP(i,0,n) REP(j,0,n)
if(G[i][k]!=INF&&G[k][j]!=INF&&G[i][j]>G[i][k]+G[k][j])
G[i][j]=G[i][k]+G[k][j];
} int main()
{
int T,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d",&A,&B,&m,&L,&K);
n=A+B;
REP(i,0,n) REP(j,0,n) G[i][j]=INF;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
--a,--b;
G[a][b]=G[b][a]=min(G[a][b],c);
}
floyd();
printf("%d\n",dijkstra());
}
return 0;
}

  

UVA-10269 Adventure of Super Mario (dijkstra)的更多相关文章

  1. UVA 10269 Adventure of Super Mario

    看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是 ...

  2. UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)

    题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...

  3. ZOJ1232 Adventure of Super Mario(DP+SPFA)

    dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t] ...

  4. zoj1232Adventure of Super Mario(图上dp)

    题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...

  5. UVA10269 Adventure of Super Mario(Floyd+DP)

    UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs ...

  6. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  7. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  8. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  9. 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode

    迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...

随机推荐

  1. Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用

    来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...

  2. HackerRank - candies 【贪心】

    HackerRank - candies [贪心] Description Alice is a kindergarten teacher. She wants to give some candie ...

  3. Redhat 7.4更新为Centos7的yum并安装docker-ce

    以下命令请在root下执行 #删除原有的yum rpm -qa|grep yum|xargs rpm -e --nodeps #install centos yum #wget http://mirr ...

  4. s3cmd安装

    配置yum.repos cd /etc/yum.repos.d/ vim s3tools.repo [s3tools] name=Tools for managing Amazon S3 - Simp ...

  5. Java-性能调优-理解GC日志

    [ ~]# cat gc.log.0 | grep 'Full GC' 1.652: [Full GC (System) 1.652: [CMS: 0K->21718K(262144K), 0. ...

  6. 游戏服务器的思考之三:谈谈MVC

    游戏服务器也是基于MVC架构的吗?是的,所有的应用系统都是基于MVC架构的,这是应用系统的天性.不管是客户端还是后台,都包含模型.流程.界面这3个基本要素:不同类型的应用,3要素的“重量”可能各有偏差 ...

  7. VMware 共享目录不显示的解决办法

    centos mount -t vmhgfs .host:/ /mnt/hgfs # 如果有如下提示: # Error: cannot mount filesystem: No such device ...

  8. centos7配置安装redis

    关闭防火墙:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启 ...

  9. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  10. 分析ReentrantLock的实现原理

    http://www.jianshu.com/p/fe027772e156 什么是AQS AQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的Re ...