HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】
来源:互联网 发布:淘宝商家发票 编辑:程序博客网 时间:2024/05/17 08:27
题意:从2到1的所有路径中找出最短的路,并且输出最短路径有几条。
策略:先求出最短路径,然后再找出从2到1的最短路径有几条。最短路径用dijkstra算法来求出,什么是dijkstra算法,简单来说,dijkstra算法就是路径长度递增次序产生最短路径的算法:
基本思想是:把集合V分成两组;
(1)S:已求出最短路径的顶点的集合
(2)V-S=T:尚未确定最短路径的顶点集合
将T中顶点按最短路径递增的次序加入到S中,
保证:(1)从源点V0到S中各顶点的最短路径长度都不大于
从V0到T中任何顶点的最短路径长度
(2)每个顶点对应一个距离值
S中顶点:从V0到此顶点的最短路径长度
T中顶点:从V0到此顶点的只包括S中顶点作中间
顶点的最短路径长度
话不多说,思想是基础,最重要的还是怎么样实现:我们就以这道题为例子:
代码:
#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f//不能换成0x7fffffff, 因为下面有个di[min_pos]+INF, 结果是会超INT范围的#define MAXN 1007int map[MAXN][MAXN], di[MAXN], ans[MAXN]; //map是邻接矩阵, di是存储的源点到各点的最小距离bool vis[MAXN];//标记int n;void dijkstra(int v){int i, j;memset(vis, 0, sizeof(vis)); //初始化di[v] = 0;vis[v] = 1;for(i = 1; i <= n; i ++){if(!vis[i]){di[i] = map[v][i]; } } for( i = 1; i < n; i ++){int min = INF;int min_pos = 0;//这个一定要等于0,不然的话会REfor(j = 1; j <= n; j ++){if(!vis[j]&&di[j] < min){min = di[j];min_pos = j;}}vis[min_pos] = 1;for(j = 1; j <= n; j ++){if(!vis[j]&&di[j] > map[min_pos][j]+di[min_pos]){di[j] = map[min_pos][j]+di[min_pos];}}}}int dfs(int v) //深搜:原理:从1点出发,每次一都找比当前di[v]小的点,找到二就说明有一条最短路径{if(ans[v] != -1) return ans[v]; //记忆化搜索if(v == 2) return 1;//找到2就说名有一条路ans[v] = 0; //初始化for(int i = 1; i <= n; i ++){if(map[v][i]!= INF&&di[i] < di[v]){ //map[v][i]!= INF 是为了判断v与i是不是有路ans[v] += dfs(i);}}return ans[v];}int main(){int m, i, j, a, b, c;while(scanf("%d", &n), n){scanf("%d", &m);for(i = 1; i <= n; i ++){//初始化,map[i][i] = 0;map[i][j] = INF;for(j = 1; j <= n; j ++){map[i][j] = i==j?0:INF;}}for(i = 0; i < m; i ++){scanf("%d%d%d", &a, &b, &c);map[a][b] = map[b][a] = c;}dijkstra(2);//for(i = 1; i <= n; i ++){//printf("%d..%d\n", di[i], i);//}memset(ans, -1, sizeof(ans));printf("%d\n", dfs(1));}return 0;}
0 0
- HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】
- hdoj 1142 A Walk Through the Forest 【dijkstra + dfs】
- HDU-1142-A Walk Through the Forest(Dijkstra+dfs)
- hdoj 1142 A Walk Through the Forest
- HDOJ 1142 A Walk Through the Forest
- hdoj 1142 A Walk Through the Forest
- HDOJ-1142-A Walk Through the Forest
- hdoj 1142 A Walk Through the Forest
- HDU1142:A Walk Through the Forest(Dijkstra+dfs)
- UVA10917 Walk Through the Forest (dijkstra + dfs)
- 【最短路+dfs+dijkstra】杭电 hdu 1142 A Walk Through the Forest
- 【Dijkstra+DFS(记忆化)】hdu 1142 A Walk Through the Forest(外:hdu 1428)
- hdu 1142 A Walk Through the Forest【Dijkstra+dfs求最短路条数】
- hdu 1142 A Walk Through the Forest Dijkstra+记忆搜索
- HDU 1142 A Walk Through the Forest(图论Dijkstra)
- hdu 1142 A Walk Through the Forest Dijkstra
- HDOJ 题目1142 A Walk Through the Forest(spfa dfs)
- HDOJ/HDU 1142 A Walk Through the Forest
- C# NameValueCollection集合
- 字符输入注意点
- SQL插入查询结果 insert into select
- 韩顺平PHP学习视频笔记整理007表单及表单控件②续课后作业
- C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
- HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】
- 学生信息管理系统总结
- android写的一个客户端。。。
- Vs2010配置html5环境
- C++ list 的使用
- echarts入门教程
- 隐式意图的配置 →显示意图激活另外一个activity
- 辛星也谈vim与emacs
- 【note】SSC配置工具Slave STack Code Tool操作重点8月8