• 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
    ",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 }
  • 相关阅读:
    网络流,再出发!
    2SAT
    并查集
    最大密度子图
    网络流提高专题(洛谷题单)
    JQuery 操作 ListBox间移动和ListBox内移动
    关于多表Update和Delete的应用
    XML格式与DataTable、DataSet、DataView格式的转换
    FCKeditor配置和精简
    点击fileupload后button事件不起作用
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3694628.html
Copyright © 2020-2023  润新知