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. POJ 1177Picture 扫描线(若干矩形叠加后周长)

    Picture   Description A number of rectangular posters, photographs and other pictures of the same sh ...

  2. Shell-11--for

    $(cat /etc/passwd) `cat /etc/passwd`

  3. HttpClient 传输文件的两种方式

    1. org.apache.commons.httpclient.HttpClient 1.1 pom <dependency> <groupId>org.apache.htt ...

  4. Tools - Vim

    Vim 简明 Vim 练级攻略 基础设置 在vim界面点击":"然后进行设置,但只会在当前vim界面生效: 添加相关设置在vim配置文件(例如"/etc/vimrc&qu ...

  5. vue 自学笔记(三) 计算属性与侦听器

    一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...

  6. Mysql配置主从同步的基本步骤

    # 配置主从同步的基本步骤 #总结为如下的步骤: # .在主服务器上,必须开启二进制日志机制和配置一个独立的ID # .在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号 ...

  7. Go并发编程之美-CAS操作

    摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...

  8. url参数+,&,=,/等转义编码

    url出现了有+,空格,/,?,%,#,&,= 等特殊符号的时候,可能在服务器端无法获得正确的参数值. 案例: <img src="BarCode39.aspx?barcode ...

  9. 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 3.Programming assignments:Face Recognition for the Happy House

    Face Recognition for the Happy House Welcome to the first assignment of week 4! Here you will build ...

  10. python常用函数和方法 - 备忘

    语法语句篇 除法运算(精确运算和截断运算) 在python2中,除法运算通常是截断除法.什么是截断除法: >>> 3/4 0 # 自动忽略小数项 要是想 得到正确结果 怎么办呢? m ...