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

再加一组测试数据:

Sample Input:

5 7

1 2 5 5

2 3 4 5

1 3 4 6

3 4 2 2

3 5 4 7

4 5 2 4

1 3 4 4

1 5

Sample Output

8 10

 #include <stdio.h>
#include <string.h> #define MAX 1005
#define INF 200000000 struct Route //路线结构体(包括距离和花费)
{
int dis;
int fare;
}; void dijkstra(struct Route map[][MAX],int dist[],int value[],int start,int end)
{
int s[MAX]; //集合,用于存放已找出的顶点
int u;
int minDis;
int minVal;
int i,j;
memset(s,,sizeof(s));
s[start] = ; //将起点放入集合
for (i=; i<MAX; i++)
{
//初始化dist和value
dist[i] = map[start][i].dis;
value[i] = map[start][i].fare;
}
//将起点的dist和value置为0
dist[start] = ;
value[start] = ;
while ()
{
u = start;
minDis = INF;
minVal = INF;
for (i=; i<MAX; i++)
{
if (dist[i]<minDis&&!s[i]) //找出距起点最近的点
{
minVal = value[i];
minDis = dist[i];
u = i;
}
else if (dist[i]==minDis&&!s[i]&&value[i]<minVal) //如果距离相等,则选择花费最少的
{
minVal = value[i];
minDis = dist[i];
u = i;
}
}
s[u] = ;
if (s[end]==) //当找出终点就结束
return;
for (i=; i<MAX; i++) //利用找出的点更新其它点到起点的距离和花费
{
if (!s[i]&&dist[i]>map[u][i].dis+dist[u])
{
dist[i] = map[u][i].dis+dist[u];
value[i] = map[u][i].fare+value[u];
}
else if (!s[i]&&dist[i]==map[u][i].dis+dist[u]) //如果距离相等,则选择花费最少的
if (value[i] > map[u][i].fare+value[u])
{
dist[i] = map[u][i].dis+dist[u];
value[i] = map[u][i].fare+value[u];
}
}
}
} int main()
{
struct Route map[MAX][MAX]; //地图的邻接矩阵
int dist[MAX]; //存放起点到各点的距离
int value[MAX]; //存放起点到各点的花费
//int pre[MAX];
int n,m; //n个点,m条边
int a,b,d,p;
int s,t; //起点,终点
int i,j;
while ()
{
scanf("%d%d",&n,&m);
if (n==&&m==)
break;
for (i=; i<=n; i++)
for (j=; j<MAX; j++)
{
map[i][j].dis = INF;
map[i][j].fare = INF;
}
for (i=; i<MAX; i++)
{
dist[i] = INF;
value[i] = INF;
}
for (i=; i<=m; i++) //将邻接矩阵初始化
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (d < map[a][b].dis)
{
//如果两点间有重边,则选出最短距离
map[a][b].dis = map[b][a].dis = d;
map[a][b].fare = map[b][a].fare = p;
}
else if (d == map[a][b].dis&&p < map[a][b].fare)
{
//重边距离相等,则选出花费最少的
map[a][b].dis = map[b][a].dis = d;
map[a][b].fare = map[b][a].fare = p;
}
}
scanf("%d%d",&s,&t);
dijkstra(map,dist,value,s,t);
printf("%d %d\n",dist[t],value[t]);
}
return ;
}

hdu-3790 最短路径问题(双重权值)的更多相关文章

  1. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  2. 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)

    参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...

  3. HDU 3790(两种权值的迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    ...

  4. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  5. HDU - 3790 最短路径问题 (dijkstra算法)

    HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...

  6. HDU-3790 最短路径问题(双重权值)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  7. hdu 1565&hdu 1569(网络流--最小点权值覆盖)

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. 题解报告:hdu 3790 最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

  9. HDU 1533 KM算法(权值最小的最佳匹配)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. 给JavaScript24条最佳实践

    作为“30 HTML和CSS最佳实践”的后续,这篇文章将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...

  2. Android开发工程师文集-1 小时学会Widget小组件开发

    前言 大家好,给大家带来Android开发工程师文集-1 小时学会Widget小组件开发的概述,希望你们喜欢 学会用Widget (小组件) Widget小组件很方便,很快捷,可以个性化,自己定制,相 ...

  3. Shell - 简明Shell入门

    本文以示例和注释的方式,对Shell编程的基本知识点进行了总结和回顾,所有脚本均已做了基本的调试和验证. Shell - 简明Shell入门 01 - 第一个脚本 脚本的定义.执行方法以及echo命令 ...

  4. Network - SSL/TLS的基本概念

    对称加密与非对称加密 加密---明文变成密文:解密---密文变为明文.在这两个过程中,都需要密钥. 对称密钥加密(共享密钥) 指的是双方共同拥有使用完全相同的单个key, 这种Key既用于加密,也用于 ...

  5. spring boot 集成freemarker

  6. asp.net mvc开发过程中的一些小细节

    现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...

  7. [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口

    问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下, ...

  8. Django--Ajax 提交

    一 什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...

  9. 在向一个ArrayList中添加大量元素前,可以使用ensureCapacity方法来增加ArrayList的容量

    参考http://www.jianshu.com/p/f174d49b391c ensureCapacity(),该方法就是 ArrayList 的扩容方法.在前面就提过 ArrayList 每次新增 ...

  10. Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析

    前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...