HDOJ 3790 最短路径问题 【双权值】

题意:。。。

难点:如何处理两个权值。

分析:题意说如果最短路径有多个,那么取价值最低的那个,所以说价值随着路径在变,如果路径不相等那么就更新路径并且更新价值,反之,则判断价值是不是要更新。

代码:

#include<stdio.h>
#include<string.h>
#define M 1002
#define INF 0x3f3f3f3f
int mapp[M][M], mapd[M][M], n, m, di[M], dp[M];//mapd是路径 mapp是价值
bool vis[M];
void dij(int v, int st)
{
	int i, j, min, pos = v;
	for(i = 1; i <= n; i++){
		di[i] = mapd[v][i];
		dp[i] = mapp[v][i];
		vis[i] = 0;
	}
	vis[v] = 1;
	di[i] = 0;
	for(i = 1; i < n; i ++){
		min = INF;
		for(j = 1; j <= n; j ++){
			if(!vis[j]&&di[j] < min){
				min = di[j];
				pos = j;
			}
		}
		vis[pos] = 1;
		for(j = 1; j <= n; j ++){
			if(!vis[j]){
				if(di[j] > di[pos]+mapd[pos][j]){ //首先判断路径要不要更新,如果要更新路径和价值
					di[j] = di[pos]+mapd[pos][j];
					dp[j] = dp[pos]+mapp[pos][j];
				}
				else if(di[j] == di[pos]+mapd[pos][j]){ //路径不用更新,在判断价值要不要更新
					if(dp[j] > dp[pos]+mapp[pos][j]){
						dp[j] = dp[pos]+mapp[pos][j];
					}
				}
			}
		}
	}
	printf("%d %d\n", di[st], dp[st]);
}
int main()
{
	int i, j, a, b, d, p;
	while(scanf("%d%d", &n, &m),n||m){
		for(i = 1; i <= n; i ++){
			for(j = 1; j <= n; j ++){
				mapd[i][j] = mapp[i][j] = INF;
			}
		}
		for(i = 0; i < m; i ++){
			scanf("%d%d%d%d", &a, &b, &d, &p);
			if(mapd[a][b]>d){
				mapp[a][b] = mapp[b][a] = p;
				mapd[a][b] = mapd[b][a] = d;
			}
		}
		int st, en;
		scanf("%d%d", &st, &en);
		dij(en, st);
	}
} 

题目链接:点击打开链接

HDOJ 3790 最短路径问题 【双权值】

时间: 2024-08-10 22:09:44

HDOJ 3790 最短路径问题 【双权值】的相关文章

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费!!! (2)更新路径的时候要注意更新花费. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int INF=9999999; 5 int map[1010][1010],Min,n,co

HDOJ 3790 双权值Dijkstra

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <cstring> 5 using namespace std; 6 7 const int INF = 1000000; 8 const int MAXSIZE = 1005; 9 10 int map[MAXSIZE][MAXSIZE]; 11 int price[MAXSIZE][MAXSIZE]; 1

HDOJ--3790--最短路径问题(双权值问题)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18046    Accepted Submission(s): 5413 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

hdoj(3790) 最短路径

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13577    Accepted Submission(s): 4156 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

HDOJ 3790 最短路径问题(dijkstra算法)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17968    Accepted Submission(s): 5385 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

hdoj 3790 最短路径问题

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17986    Accepted Submission(s): 5394 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费.假设最短距离有多条路线,则输出花费最少的. Input

AOJ2249 最短路+最小花费(双权值)

写题解之前先骂一下这道题 xxx给数据范围点数<1e4,边数<2e4,结果我开2e4和3e4都RE,然后找问题一个多小时,最后我开了1e5和2e5,题面太能唬人了吧!?真是sb题面 ------------------------------------------分割线------------------------------------ 题目大意:给n个点和m条边,每条边给了起始点,距离和价格,求在保证点1到其他n-1个点的路径都是最短路的前提下所有路的价格之和的最小值 简单的Dijks

POJ 2253 Frogger(Dijkstra变形——最短路径最小权值)

题目链接: http://poj.org/problem?id=2253 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists' suns

有向图单源非负权值回路最短路径——BellmanFord算法

BellmanFord算法是一种暴力求解算法O(N3),它考虑所有情况,所以可以允许边的权值为负.(不过不允许出现负权值回路,因为那样会出现无限小) 之所以说它暴力,是因为它求出了每个节点所有长度为1的路径,再求所有长度为2的路径,并更新最短路径数组dist[]和path[],如此迭代直至求到长度n-1的路径.(n为图节点个数) 整体来看,每个节点纵向比较,从1到n-1长度的路径中取最小值作为最终路径长度. 因为它考虑了所有情况,所以负边也可以算出. 因为暴力,复杂度比Dijkstra高一个数量