zoukankan      html  css  js  c++  java
  • 九度OJ1008

    这道题其实就是一个简单的Dijkstra变形,只是要考虑重边的情况。

    当在更新图中点到起点的距离时,将花费p也计算在内;如果长度与之前计算的值相等,则再考虑此时花费p是否会更少,是的话则仍然要更新最短路径。

    我一开始想的是跑一遍迪杰斯特拉,记录下最短路的重边,然后再根据重边构建一个新的图,图中的权值则是花费p,再以此跑一遍Dijkstra,则就能得到题目要求的情况。这样理论上能做,但实现起来很麻烦,不如上面提到的简单。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <vector>
     4 #include<string.h>
     5 #define INF 1<<30
     6 using std::vector;
     7 int n,m,graph[2][1001][1001],s,t,D[1001],P[1001];
     8 bool visited[1001];
     9 //vector<int> p[1001];
    10 void Dijkstra()
    11 {
    12     int i,j;
    13     //visited[s]=1;
    14     for(i=1;i<=n;i++)
    15     {
    16         D[i]=INF;
    17         P[i]=INF;
    18     }
    19     P[s]=0;
    20     D[s]=0;
    21     for(j=1;j<=n;j++)
    22     {
    23         int min=INF;
    24         int k=-1;
    25         for(i=1;i<=n;i++)
    26         {
    27             if(visited[i]==0&&min>D[i])
    28             {
    29                 min=D[i];
    30                 k=i;
    31             }
    32         }
    33         if(k!=-1)
    34         {
    35             visited[k]=1;
    36             for(i=1;i<=n;i++)
    37             {
    38                 if(visited[i]==0&&D[i]>=D[k]+graph[0][k][i])
    39                 {
    40                     if(D[i]>D[k]+graph[0][k][i])
    41                     {
    42                         D[i]=D[k]+graph[0][k][i];
    43                         P[i]=P[k]+graph[1][k][i];
    44                         //printf("%d %d %d
    ",i,D[type][i],P[i]);
    45                     }
    46                     else if(D[i]==D[k]+graph[0][k][i]&&P[i]>P[k]+graph[1][k][i])
    47                     {
    48                         P[i]=P[k]+graph[1][k][i];
    49                     }
    50 
    51                 }
    52             }
    53         }
    54     }
    55 }
    56 int main()
    57 {
    58     int i,j;
    59     //printf("%d
    ",INF);
    60     scanf("%d%d",&n,&m);
    61     while(!(n==0&&m==0))
    62     {
    63         int a,d,b,p1;
    64         memset(visited,0,sizeof(visited));
    65         for(i=1;i<=n;i++)
    66         for(j=1;j<=n;j++)
    67         {
    68             if(i==j)
    69             {
    70             graph[0][i][j]=0;
    71             graph[1][i][j]=0;
    72             }
    73             else
    74             {
    75             graph[0][i][j]=INF;
    76             graph[1][i][j]=INF;
    77             }
    78         }
    79         for(i=1;i<=m;i++)
    80         {
    81             scanf("%d%d%d%d",&a,&b,&d,&p1);
    82             graph[0][a][b]=d;
    83             graph[0][b][a]=d;
    84             graph[1][a][b]=p1;
    85             graph[1][b][a]=p1;
    86         }
    87         scanf("%d%d",&s,&t);
    88         Dijkstra();
    89         printf("%d %d
    ",D[t],P[t]);
    90         scanf("%d%d",&n,&m);
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    POJ 2240 Arbitrage spfa 判正环
    POJ 3259 Wormholes spfa 判负环
    POJ1680 Currency Exchange SPFA判正环
    HDU5649 DZY Loves Sorting 线段树
    HDU 5648 DZY Loves Math 暴力打表
    HDU5647 DZY Loves Connecting 树形DP
    CDOJ 1071 秋实大哥下棋 线段树
    HDU5046 Airport dancing links 重复覆盖+二分
    HDU 3335 Divisibility dancing links 重复覆盖
    FZU1686 神龙的难题 dancing links 重复覆盖
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/3952179.html
Copyright © 2011-2022 走看看