*本文介绍了一些Dijkstra的变型例题,对Dijkstra算法不是很了解了可以移步上篇博客http://blog.csdn.net/sm9sun/article/details/53283791

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2066

题目描述:

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9

解题思路:

我们将草儿的家看做0,从草儿家到相邻镇的花费看做0,那么我们就只需要求草儿家到各个目的地的最短路即可,一次Dijkstra便可解决~

#include<stdio.h>
#include<string.h>
#define inf 0xFFFFFFF
int fmax(int a,int b)
{return a>b?a:b;
}
int fmin(int a,int b)
{return a<b?a:b;
}
int T,S,D,n;
int map[1111][1111];
int vis[1111],cast[1111];
int s[1111],e[1111];void Dijkstra()
{int i,j,minn,pos;memset(vis,0,sizeof(vis));vis[0] = 1;for(i = 0; i<=n; i++)cast[i] = map[0][i];for(i = 1; i<=n; i++){minn = inf;for(j = 1; j<=n; j++){if(cast[j]<minn && !vis[j]){pos = j;minn = cast[j];}}vis[pos] = 1;for(j = 1; j<=n; j++){if(cast[pos]+map[pos][j]<cast[j] && !vis[j])cast[j] = cast[pos]+map[pos][j];}}
}int main()
{int i,j,x,y,z,start,end;while(~scanf("%d%d%d",&T,&S,&D)){n = 0;for(i = 0; i<1111; i++){for(j = 0; j<1111; j++)map[i][j] = inf;map[i][i] = 0;}while(T--){scanf("%d%d%d",&x,&y,&z);n = fmax(fmax(n,x),y);if(z<map[x][y])map[x][y] = map[y][x] = z;}int minn = inf;for(i = 0; i<S; i++){scanf("%d",&s[i]);map[0][s[i]] = map[s[i]][0] = 0;}for(i = 0; i<D; i++)scanf("%d",&e[i]);Dijkstra();for(i = 0; i<D; i++)minn = fmin(minn,cast[e[i]]);printf("%d\n",minn);}return 0;
}

题目链接:

http://poj.org/problem?id=1062

题目描述:

Description
年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。 
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。 
Input
输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。
Output
输出最少需要的金币数。
Sample Input
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
Sample Output
5250

题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1
由于有N个物品,我们就可以把它们看作是N个点,从其他点到他的优惠关系视做边,又因为最后总是要找到物品1,所以可以看作是从起点0,到将物品1作为终点的最小路劲。然后由于题目是说,这条路劲上不能有两个的等级差超过M,所以我们可以枚举最小等级,将每个点视作最小等级,这样的话就不会掉解。
又由于我们是枚举的最小等级,所以源点0到其他每个点的边的权值就要赋值为那个点的价格,降等级比最小等级要大,或者差距大于M的其他点标记为不合法(也就是不可以走),然后在从合法的路劲中找出最小花费。

#include<stdio.h>
#include<string.h>
#define inf 0xfffffff
int n,m,l[110],dp[110][110],dis[110],z[110];
int fmin(int a,int b)
{
return a<b?a:b;
}
int Dijkstra()
{for(int i=1;i<=n;i++)dis[i]=dp[0][i];for(int i=0;i<n;i++){int min=inf;int p=-1;for(int j=1;j<=n;j++)if(!z[j]&&dis[j]<min){min=dis[j];p=j;}if(p==-1)break;z[p]=1;for(int j=1;j<=n;j++)if(!z[j]&&dis[j]>dis[p]+dp[p][j])dis[j]=dis[p]+dp[p][j];}return dis[1];
}
int main()
{int i,j;while(scanf("%d%d",&m,&n)!=EOF){memset(l,0,sizeof(l));memset(dp,1,sizeof(dp));for(int i=1;i<=n;i++){int k;dp[i][i]=0;scanf("%d%d%d",&dp[0][i],&l[i],&k);while(k--){int v,c;scanf("%d%d",&v,&c);dp[v][i]=c;}}int x=inf;for(int i=0;i<=m;i++){memset(z,0,sizeof(z));for(int j=1;j<=n;j++)if(l[j]<l[1]-i||l[j]>l[1]+m-i)z[j]=1;x=fmin(x,Dijkstra());}printf("%d\n",x);}return 0;
}

最短路径——Dijkstra算法扩展(hdu2066,poj1062)相关推荐

  1. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  2. 最短路径-Dijkstra算法与Floyd算法

    最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一.最短路径 ①在非网图中,最短路径是指两顶点之间 ...

  3. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  4. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  5. 使用邻接矩阵实现有向图最短路径Dijkstra算法

    题目描述: 用邻接矩阵存储有向图,实现最短路径Dijkstra算法,图中边的权值为整型,顶点个数少于10个. 输入描述 首先输入图中顶点个数和边的条数: 再输入顶点的信息(字符型): 再输入各边及其权 ...

  6. 最短路径——Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法 C语言代码实现 代码解析 Floyd算法 算法解析 C语言代码实现 最短路径问题 最短路径问题是我们经常会面临的一种决策问题.在图论中,非网图(边没有权值)的最短路径就 ...

  7. 最短路径——Dijkstra算法HDU Today(hdu2112)

    关于本题的floyd解法:http://blog.csdn.net/sm9sun/article/details/53282826 上篇博文介绍了floyd解决最短路径的方法,然而由于floyd极大的 ...

  8. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  9. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

最新文章

  1. 剑指offer:面试题22. 链表中倒数第k个节点
  2. The bag-of-words model
  3. 网络营销——网络营销专员浅析网站快照更新要点
  4. python基础教程第四版-python基础教程第4版pdf
  5. Taylor Swift - Red
  6. SSM中使用Mybatis的PageHelper插件实现分页
  7. 动态系统开发方法DSDM
  8. UVA - 315 Network(tarjan求割点)
  9. 通俗易懂。HTTP请求行、请求头、请求体、响应行、响应头、响应体详解
  10. 寒假作业3:抓老鼠啊
  11. c# MEF框架(三 导出类的方法和属性)
  12. 程序员网上晒出新同事与老同事一起吃饭的照片,太搞笑
  13. python两个dataframe求差集_spark计算两个DataFrame的差集、交集、合集
  14. 收藏 | NLP论文、代码、博客、视频资源(LSTM,指针模型,Attention, ELMo,GPT,BERT、多任务学习等)...
  15. java List 排序 Collections.sort()
  16. 注册、注销与结束session变量
  17. Word2003及Excel2003打开速度慢,如何解决?
  18. perl语言hello world程序
  19. Win10 卸载了某软件,右键还有该软件,如何删除呢?
  20. OpenCV 3.0 高动态范围图像

热门文章

  1. 9.3 LSMW程序创建操作手册 第5 6 7步
  2. Java环境创建_Java环境的搭建
  3. 倒计时按钮_办公小技巧:轻松玩转PPT秒针倒计时
  4. python直接用解释器编写和编辑器的区别_Python语言编译器与解释器
  5. epochs,batch_size,iterations详解
  6. oracle 拼接_老品牌福建泉州49寸液晶拼接屏多少钱品质
  7. 测试http请求的Chrome插件:Postman插件的查找安装模拟测试 - 讲解篇
  8. 达梦数据库修改字段长度_解决达梦数据库新增大字段报错问题
  9. python map lambda 分割字符串_Python特殊语法:filter、map、reduce、lambda [转]
  10. NP管理器v3.0.25 一键添加去除apk对话框等