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. ReactNative学习笔记(五)踩坑总结

    已经发现的bug或者问题 Android不支持shadow属性: Animated.Image的borderRadius不生效: setNativeProps无法修改图片的source: 没有直接设置 ...

  2. Kaldi如何准备自己的数据

    Introduction 跑完kaldi的一些脚本例子,你可能想要自己用Kaldi跑自己的数据集.这里将会阐述如何准备好数据. run.sh较上的部分是有关数据准备的,通常local与数据集相关. 例 ...

  3. 使用PostgreSQL进行中文全文检索

    code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...

  4. 音视频编解码——RGB与YUV格式转换

    一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...

  5. WebRTC 学习之 概念总结

    在学习WebRTC的时候,接触到了好多新的概念,在这里做一下备忘吧 RTMP协议 Real Time Messaging Protocol(实时消息传输协议).该协议基于TCP,是一个协议族,包括RT ...

  6. 小程序基础知识点讲解-WXML + WXSS + JS,生命周期

    小程序基础 小程序官方地址,小程序开发者工具,点击此处下载.在微信小程序中有一个配置文件project.config.json,此文件可以让开发者在不同设备中进行开发. 微信小程序共支持5种文件,wx ...

  7. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置

    仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...

  8. java中微信统一下单采坑(app微信支付)

    app支付前java后台统一下单文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 微信支付接口签名校验工具:https ...

  9. JAVA基础 <一>

    java基础的学习要领,多写多写. 学习方法很简单,了解  到  理解  到 熟悉  到 精通 先讲变量吧: public static void main(String[] args) { int ...

  10. nginx ngx_http_sub_module使用

    ngx_http_sub_module模块是一个过滤器,它修改网站响应内容中的字符串,比如你想把响应内容中的‘iuwai’全部替换成‘aaaaa‘,这个模块已经内置在nginx中,但是默认未安装,需要 ...