HDU 3790 最短路径问题 裸跑dijkstra
2015-08-07 16:54
471 查看
原题: http://acm.hdu.edu.cn/showproblem.php?pid=3790
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17964 Accepted Submission(s): 5384
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1< n<=1000, 0< m < 100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
要最小花费,地图上不能到达的点钱要初始化成INF,而不能是0;
要考虑各种相同路径的时候,价格要选择小的。
最初的dis和cost应该直接从图中数据初始化一次,后面跑dij的次数减一次就行了。
题目:
最短路径问题Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17964 Accepted Submission(s): 5384
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1< n<=1000, 0< m < 100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
思路:
本题要注意的地方:要最小花费,地图上不能到达的点钱要初始化成INF,而不能是0;
要考虑各种相同路径的时候,价格要选择小的。
最初的dis和cost应该直接从图中数据初始化一次,后面跑dij的次数减一次就行了。
代码:
#include"cstdio" #include"iostream" #include"string.h" #define INF 0x7f7f7f7f using namespace std; const int N = 1005; int dis ; int cost ; bool vis ; int maze ; int mcos ; void init() { memset(dis,INF,sizeof(dis)); memset(maze,INF,sizeof(maze)); memset(mcos,INF,sizeof(mcos)); memset(vis,false,sizeof(vis)); memset(cost,INF,sizeof(cost)); } int n,m; void dij(int st,int en) { vis[st]=true; for(int i=1;i<=n;i++) { dis[i]=maze[st][i]; cost[i]=mcos[st][i]; } for(int i=1;i<n;i++) { int minn=INF; int mark; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<minn) { minn=dis[j]; mark=j; } } vis[mark]=true; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>dis[mark]+maze[mark][j]) { dis[j]=dis[mark]+maze[mark][j]; cost[j]=cost[mark]+mcos[mark][j]; } else if(!vis[j]&&dis[j]==dis[mark]+maze[mark][j]) if(cost[j]>cost[mark]+mcos[mark][j]) cost[j]=cost[mark]+mcos[mark][j]; } } printf("%d %d\n",dis[en],cost[en]); } int main() { while(scanf("%d %d",&n,&m),n,m) { init(); for(int i=1;i<=m;i++) { int x,y,len,co; scanf("%d %d %d %d",&x,&y,&len,&co); if(x!=y&&maze[x][y]>len) { maze[y][x]=len; maze[x][y]=len; mcos[x][y]=co; mcos[y][x]=co; } else if(x!=y&&maze[x][y]==len) { if(mcos[x][y]>co) { mcos[x][y]=co; mcos[y][x]=co; } } } int st,ed; scanf("%d %d",&st,&ed); dij(st,ed); } }
相关文章推荐
- 算法练习
- mvn 请使用 -source 7 或更高版本以启用 diamond 运算符
- HDOJ-3240 Counting Binary Trees(数论)
- 如何产生各种随机数
- Android LayoutInflater深度解析 给你带来全新的认识
- Android NDK 开发
- 使用dbghelp生成dump文件以及事后调试分析
- 用MHA实现mysql自动故障转移
- jQuery插件2(拖拽draggable/放置droppable/排序sortable/面板折叠accordion/横向选项卡tabs/对话框dialog/menu/微调spinner/框提示)
- PASSION之MAVEN工程详解
- 导入他人项目问题
- cmake 生成器(generator)
- Bootstrap的js插件之按钮(button)
- sql面试题详解
- oracle glogin.sql 和login.sql使用
- 怎样将应用程序最小化到托盘?
- UIPageViewController 的简单使用
- scanf
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
- scanf