hdu-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
再加一组测试数据:
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 最短路径问题(双重权值)的更多相关文章
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)
参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...
- HDU 3790(两种权值的迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- HDU-3790 最短路径问题(双重权值)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- hdu 1565&hdu 1569(网络流--最小点权值覆盖)
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 题解报告:hdu 3790 最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
- HDU 1533 KM算法(权值最小的最佳匹配)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- [算法专题] 二分搜索&排序数组
基础知识 二分非递归写法: int binary_search(const int a[], const int size, const int val) { int lower = 0; int u ...
- 【vue】项目编译报错 Error: No PostCSS Config found in...
问题描述: 项目在本地运行不报错,上传到 GitHub 之后,再 clone 到本地,执行: npm install 安装完成之后再执行: npm run dev 这时报错 Error: No Pos ...
- Sequential Container
Notes from C++ Primer Initialize container by iterator When copy a container to another, the contain ...
- javascript从作用域到闭包-笔记
读<你不知道的javascript>一书做个笔记;编译原理: js是一门编译型的语言,与传统编译语言类似,传统编译的过程分为三个阶段 ; 1. 分词/词法分析; 2.解析/语 ...
- Android NDK学习(四):C/C++层调用JAVA
一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ...
- Windows 系统 IP 和端口的相关检测命令
查看本机IP地址 查看自己电脑的ip,使用 ipconfig 命令 ipconfig 检测指定IP是否联通 检测某个ip是否可以连通,直接使用 ping 命令 ping 219.148.111.212 ...
- vue-cli3.0 升级记录
年三十时 vue2.6 发布,向 3.0 看齐,说明 3.0 不远了.作为开发者也应该为vue3.0 做点准备.首先是把 vue-cli 升级到 3.x ,在这记录下 vue-cli2.x 升级 vu ...
- web自动化测试---css方式定位页面元素
css方式定位的方法也有很多,相较于xpath更灵活一点,下面就介绍下使用方法(以百度输入框为例) 1.通过tag来定位,可以写成如下: driver.find_element_by_css_sele ...
- FF笔试题整理
一.选择题 1.怎样能唯一确定一颗二叉树? [解析] 只要知道中序遍历顺序,再加上其余两个遍历中任意一个都可以唯一确定一个二叉树.如果不知道中序遍历顺序,则无法确定. [反例] A-B-C,A是跟,B ...
- 修改centos 7 系统时间
查看当前系统时间 date 修改当前系统时间 date -s "2018-2-22 19:10:30 查看硬件时间 hwclock --show 修改硬件时间 hwclock --set - ...