主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

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
 
Source


代码例如以下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 1017
#define INF 0x3fffffff
using namespace std;
int mat[MAXN][MAXN];
int cost[MAXN][MAXN];
int n,m;//n为结点数。m为道路数
int MONEY[MAXN];
int dijkstra (int s,int f)
{
//s为起点。 f:为终点
int dis[MAXN];//记录到随意点的最短距离
int mark[MAXN];//记录被选中的结点
int i, j, k;
for(i = 1; i <= n; i++)
{
mark[i] = 0;//初始化全部结点。每一个结点都没有被选中
dis[i] = mat[s][i];
MONEY[i] = cost[s][i];
}
mark[s] = 1;//start结点被选中
dis[s] = 0;//将start结点的的距离设置为0
int min;//设置最短的距离。
for(i = 1; i <= n; i++)
{
k = 1;//赋初值非常重要
min = INF;
for(j = 1; j <= n;j++)
{
if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中
{
min = dis[j] ;
k = j;
}
}
mark[k] = 1;//标记为被选中
for(j = 1; j <= n; j++)
{
if(!mark[j] && dis[j]>dis[k]+mat[k][j])//改动剩余结点的最短距离
{
dis[j] = dis[k] + mat[k][j];
MONEY[j]=MONEY[k]+cost[k][j];
}
else if(!mark[j] && dis[j]==dis[k]+mat[k][j])
{
if(MONEY[j] > MONEY[k]+cost[k][j])
MONEY[j] = MONEY[k]+cost[k][j];
}
}
}
return dis[f];
} void init()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cost[i][j] = INF;
if(i == j)
mat[i][j] = 0;
else
mat[i][j] = INF;
}
}
}
int main()
{
int i,j;
int a,b,dis,mon;
while(scanf("%d %d",&n,&m))
{
if(n == 0 && m == 0)
break;
init();
for(i = 1; i <= m; i++)
{
scanf("%d %d %d %d",&a,&b,&dis,&mon);
if(dis < mat[a][b])
{
mat[a][b] = mat[b][a] = dis;
cost[a][b] = cost[b][a]= mon;
}
if(dis == mat[a][b])
{
if(mon < cost[a][b])
cost[a][b] = cost[b][a] = mon;
}
}
int s, e;
scanf("%d%d",&s,&e);
int ans = dijkstra(s, e);
printf("%d %d\n",ans,MONEY[e]);
}
return 0;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

最新文章

  1. json是个啥东东
  2. jenkins自动部署maven工程到服务器----SSH+shell
  3. Android Studio配置Git及Git文件状态说明
  4. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
  5. 重拾C,一天一点点_10
  6. c++ enum用法【转】
  7. nopcommerce插件使用
  8. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
  9. UML学习(一)类图和对象图
  10. MVC 5学习总结笔记1
  11. python常用模块(2)
  12. Linux下RabbitMq安装
  13. Golang 入门 : 字符串
  14. shell脚本学习-练习写一个脚本1
  15. luogu1397 [NOI2013]矩阵游戏 (等比数列求和)
  16. vue层级关系的数据管理
  17. Eclipse创建web项目目录结构
  18. php中的heredoc和nowdoc对比
  19. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
  20. 11款CSS3动画工具的开发

热门文章

  1. C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)
  2. Python标准库:内置函数dict(iterable, **kwarg)
  3. Esper学习之四:Context
  4. protobuf-2.5.0.tar.gz的下载与安装
  5. 同一个页面里的JS怎样获取jsp从别的页面获取的参数
  6. android doGet和doPost
  7. docs/pcs/rest/file data apis list - 百度开发者中心
  8. 整理自百度知道提问的几道Java编程题
  9. POI数据下载器
  10. 解决org.hibernate.LazyInitializationException: could not initialize proxy - no Session懒载入问题