[Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)

题目链接:http://acm.swust.edu.cn/problem/842/

Time limit(ms): 1000        Memory limit(kb): 10000

Description

2012新的暑期集训开始了,一切都还相当不错,但是有一个问题成为了同学们的难题,那就是从实验室到食堂时,天气是非常的炎热,以至于大家都尽量避免从没有遮阴的地方走过,但是某些路径又不得不从没有遮阴的地方走过,所以现在难题出来了,给予你一些单向路段,让你找出从实验室到食堂,晒太阳最少的路径长度,以及该条路径的总长度。如果存在多条最少晒太阳的路径,则总长度要求最短。

输入n和m,表明是有n<=1000个转折点,m条路径,然后输入m(m<=100000)条路径,每一条路径包括4个数据,s,e,dis1 , dis2,分别表示该条路径的起点,

终点,路径总长度,以及没有遮阴路径的长度(dis1>=dis2);

结果保证小于2^31

Input

输出两个值,第一个值是没有遮阴路径的最小总长度,第二个是该条路径的总长度,如果没有遮阴路径的最小总长度相等,

Output

输出二者中总路径长度最小的那条路径的长度值。

Sample Input

    


3 4

1 2 10 2

1 2 11 1

2 3 5 2

2 3 7 1

4 4

1 2 10 2

2 4 10 3

1 3 5 3

3 4 16 2

Sample Output


2 18

5 20

解题思路:起点为1,终点为n,两个数组,一个存贮路径长度,一个是最少晒到阳光的长度,然后用Dijkstra算法就是~~~~

代码如下:

 1 #include <iostream>
 2 #include <cstring>
 3 const int maxn = 1005;
 4 const int inf = 0x3f3f3f3f;
 5 using namespace std;
 6
 7 int diaA[maxn][maxn], disB[maxn][maxn], n, m, x, y, d1, d2;
 8
 9 void init()
10 {
11     for (int i = 1; i <= n; i++){
12         for (int j = i; j <= n; j++)
13             diaA[i][j] = diaA[j][i] = disB[i][j] = disB[j][i] = inf;
14     }
15 }
16 void Dijkstra(){
17     int dis[maxn], pay[maxn], vis[maxn], i, j, k;
18     memset(vis, 0, sizeof(vis));
19     for (i = 1; i <= n; i++){
20         dis[i] = diaA[1][i];
21         pay[i] = disB[1][i];
22     }
23     vis[1] = 1;
24     for (i = 1; i <= n; i++){
25         int min = inf;
26         for (j = 1; j <= n; j++){
27             if (!vis[j] && pay[j] < min){
28                 min = pay[j];
29                 k = j;
30             }
31         }
32         vis[k] = 1;
33         for (j = 1; j <= n; j++){
34             if (!vis[j]){
35                 if (pay[k] + disB[k][j]<pay[j] || pay[k] + disB[k][j] == pay[j] && dis[j]>dis[k] + diaA[k][j]){
36                     pay[j] = pay[k] + disB[k][j];
37                     dis[j] = dis[k] + diaA[k][j];
38                 }
39             }
40         }
41     }
42     cout << pay[n] << ‘ ‘ << dis[n] << endl;
43 }
44
45 int main(){
46     while (cin >> n >> m){
47         init();
48         for (int i = 0; i < m; i++){
49             cin >> x >> y >> d1 >> d2;
50             if (d2 < disB[x][y] || d2 == disB[x][y] && d1 < diaA[x][y]){
51                 diaA[x][y] = d1;
52                 disB[x][y] = d2;
53             }
54         }
55         Dijkstra();
56     }
57     return 0;
58 }

时间: 2024-09-30 19:07:40

[Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)的相关文章

POJ-3268-最短路(dijkstra算法)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

最短路 Dijkstra算法

Dijksitra算法求最短路仅仅适用于不存在右边是负权的情况(Bellman-Ford算法没有这一个限制).主要特点是从起点为中心向外层层扩展,直到扩展到终点为止. 最短路的最优子结构性质 即一个最短路路径中经过的所有点这条路均是其最短路.(反证法易证) Dijkstra基本思路: ①找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离 ②此后不需要再关心1中的"最短距离已经确定的顶点" 在最开始的时候,只有起点的最短距离是确定的.而在尚未使用过的顶点中,距离d[i]最小的顶点

单源最短路Dijkstra算法——matlab实现

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

hdu2544 最短路 Dijkstra算法

最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 96778    Accepted Submission(s): 41849借鉴链接:https://blog.csdn.net/UncleJokerly/article/details/79703622 Problem Description 在每年的

哈理工 oj 2122 旅行(map + 最短路dij算法)

旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Rating: Special Judge: No Description "04.24,和Sakura去东京天空树,世界上最暖和的地方天空树的顶上. " "04.26.和Sakura去明治神宫.有人在那里举办婚礼." "04.25.和Sakura去迪士尼.鬼屋非

hubust 1339Touring (最短路Dijkstra算法)

Description: The best friends Mr. Li and Mr. Liu are touring in beautiful country M. M has n cities and m two-way roads in total. Each road connects two cities with fixed length.We assume that the cost of car traveling on the road is only related to

matlab 单元最短路 Dijkstra算法 有向图 无向图

W = [2 8 1 1 6 5 1 2 3 6 4 9 3 7 9]; S = [0 0 0 1 1 3 3 3 5 5 6 4 6 2 2];S=S+1; T = [1 3 2 4 3 4 5 6 4 7 5 7 7 3 6];T=T+1; IDS={'u0','u1','u2','u3','u4','u5','u6','u7'}; DG = sparse(S,T,W,8,8)%求稀疏矩阵 UG =tril(DG+DG')%取矩阵和转置矩阵和的下三角矩阵. bg=biograph(DG,ID

POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects