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];
12 int n;
13
14 void Dijkstra(int s,int e){
15 bool done[MAXSIZE];
16 int dis[MAXSIZE],co[MAXSIZE];
17
18 memset(done,0,sizeof(done));
19
20 for(int i = 0;i <= n;i++)
21 dis[i] = INF;
22 dis[s] = co[s] = 0;
23
24 for(int i = 0;i <= n;i++){//最多执行n+1次操作
25 int pos,minn = INF;
26 for(int j = 0;j <= n;j++){//先找到d[]最小的点
27 if(!done[j] && dis[j] < minn){
28 minn = dis[j];
29 pos = j;
30 }
31 }
32 done[pos] = 1;//将该点加入集合
33 for(int j = 0;j <= n;j++){//再更新所有的d[]
34 //if(!done[j] && d[minx] + map[minx][j] < d[j])
35 //d[j] = d[minx] + map[minx][j];
36
37 if (!done[j] && map[pos][j] != INF){
38 //若存在更小的路径,取更小的路径
39 if (dis[j] > dis[pos] + map[pos][j]){
40 dis[j] = map[pos][j] + dis[pos];
41 co[j] = price[pos][j] + co[pos];
42 }
43 //当最短路径相等时候,取价格小的
44 else if (dis[j] == dis[pos] + map[pos][j] && co[j] > co[pos] + price[pos][j])
45 co[j] = co[pos] + price[pos][j];
46 }
47 }
48 }
49 printf("%d %d\n",dis[e],co[e]);
50 }
51
52 int main(){
53 int m,s;
54 int i,j;
55 int p,q,t,pri;
56 int ww,ans;
57
58 while(scanf("%d%d",&n,&m) , n || m){
59 ans = 100000000;
60 for(i = 0;i < MAXSIZE;i++){
61 for(j = 0;j < MAXSIZE;j++){
62 if(i == j)
63 map[i][j] = 0;
64 else
65 map[i][j] = INF;
66 }
67 }
68 while(m--){
69 scanf("%d%d%d%d",&p,&q,&t,&pri);
70 if(t < map[p][q]){//可能两站间存在多条线路取短的那条路
71 map[p][q] = t;
72 map[q][p] = t;
73 price[p][q] = pri;
74 price[q][p] = pri;
75 }
76 }
77 scanf("%d%d",&ww,&s);
78 map[0][ww] = 0;
79 Dijkstra(0,s);//巧妙之处,加入超级源点0
80 }
81 return 0;
82 }

HDOJ 3790 双权值Dijkstra,布布扣,bubuko.com

时间: 2024-10-02 10:27:01

HDOJ 3790 双权值Dijkstra的相关文章

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是价值 boo

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

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

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

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

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

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

HDU 4738 --Caocao&#39;s Bridges 【无向图边双联通 &amp;&amp; 求权值最小的桥 &amp;&amp; 模板】

Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2641    Accepted Submission(s): 855 Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. B

hdu Caocao&#39;s Bridges(无向图边双连通分量,找出权值最小的桥)

1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权值不一样) 7 3,如果找到了桥的最小权值为0,也就是桥上的士兵数为0,那么还是要最少派一个 8 士兵过去炸掉桥! 9 10 思路:假设每两个节点最多只有一条边进行相连! 11 进行tarjan算法,如果该算法调用了超过2次,说明这个原图就是不连通的! 12 否则在tarjan算法中将桥存起来!然后

hdoj 3435 A new Graph Game 【无向图判断权值最小哈密顿环】【KM算法】

A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1934    Accepted Submission(s): 827 Problem Description An undirected graph is a graph in which the nodes are connected by undir