zoukankan      html  css  js  c++  java
  • [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 }
    View Code
  • 相关阅读:
    键盘移动小div(js原生)
    递归好理解,可是不好用啊
    jsonp
    闭包
    json
    来个小例子(ajax)
    ajax小demo
    制作H5响应式页面注意事项、微信二次分享
    Button按钮--inject与provide
    webpack基本打包配置流程
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4580404.html
Copyright © 2011-2022 走看看