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 ...
随机推荐
- WebViewJavascriptBridge浅析
WebViewJavascriptBridge是一个Objective-C与JavaScript进行消息互通的三方库.通过WebViewJavascriptBridge,我们可以很方便的实现OC和Ja ...
- ReactNative学习笔记(一)环境搭建
前言 本文开发环境为Windows,目标平台为Android,react-native版本为0.35.0. 环境搭建 注意,本文不是按照官网的教程来的,官网说必须安装什么Chocolatey,我懒得鸟 ...
- kaldi脚本注释二
steps/decode.sh #!/bin/bash # Copyright 2012 Johns Hopkins University (Author: Daniel Povey) # Apach ...
- 自适应Simpson法与积分初步
前言 不知道为什么,今天感觉想要写一下数学的东西,然后就看了一下我还有这个模板不会,顺手写了一下. 没有学过微积分的最好还是看一下求导为好. 求导 听说很多人都不会求导,我写一下吧qwq 令\(f(x ...
- 转---深入浅出妙用 Javascript 中 apply、call、bind
作者:伯乐在线专栏作者 - chokcoco 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师 ...
- ElasticSearch权威指南学习(映射和分析)
概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等).+ 分析(analysis)机制用于进行全文 ...
- 学生成绩管理系统(C++指针、链表、文件及面向对象的运用)
学生成绩管理系统 功能页面显示: 实现源码: #include<iostream> #include<fstream> #include<cstring> # ...
- CUDA driver version is insufficient for CUDA runtime version 解决
配置ubuntu17.1+CUDA9.2的caffe环境,CUDA sample编译完成,执行到./deviceQuery时报错:CUDA driver version is insufficient ...
- Angular使用总结 --- 通过指令动态添加组件
之前自己写的公共组件,都是会先引入,需要调起的时候再通过service控制公共组件状态.值.回调函数什么的.但是有一些场景不适合这种方式,还是动态添加组件更加好.通过写过的一个小组件来总结下. 创建组 ...
- Xamarin.Android 使用 SQLite 出现 Couldn't read row 0, col -1 from CursorWindow. 异常
异常:Java.Lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cu ...