zoukankan      html  css  js  c++  java
  • poj 3463 最短路径+次最短路径+邻接表

    算法:Dijstra算法

    题目大意:求出最短路径和次最短路径,如果最短路径+1==次最短路径,则输出最短路径条数+次最短路径条数,否则输出最短路径条数。

    用邻接表做,不用邻接矩阵,因为有重边。我开是用邻接矩阵做的,算法没问题,卡了半天,计算条数的时候会少。

    View Code
     1 #include <stdio.h>
    2 #include <string.h>
    3
    4 const int INF = 1 << 30;
    5 int dis[1005][2],v[1005][2],dp[1005][2],box[1005];
    6 struct node
    7 {
    8 int u,val,next;
    9 }Edge[10005];
    10 int n,m,S,T;
    11 int Dijstra(int S,int T)
    12 {
    13 int i,j;
    14 memset(v,0,sizeof(v));
    15 memset(dp,0,sizeof(dp));
    16 for(i = 1;i <= n;i ++)
    17 dis[i][0] = dis[i][1] = INF;
    18 dis[S][0] = 0;
    19 dp[S][0] = 1;
    20 int x,flag;
    21 for(i = 1;i <= n*2;i ++)
    22 {
    23 int min_d = INF;
    24 for(j = 1;j <= n;j ++)
    25 {
    26 if(!v[j][0] && min_d > dis[j][0])
    27 {
    28 min_d = dis[j][0];
    29 x = j;
    30 flag = 0;
    31 }
    32 else if(!v[j][1] && min_d > dis[j][1])
    33 {
    34 min_d = dis[j][1];
    35 x = j;
    36 flag = 1;
    37 }
    38 }
    39 v[x][flag] = 1;
    40 if(min_d == INF) break;
    41 for(j = box[x];j != -1;j = Edge[j].next)
    42 {
    43 int len = min_d + Edge[j].val,y = Edge[j].u;
    44 if(len < dis[y][0])
    45 {
    46 dis[y][1] = dis[y][0];
    47 dp[y][1] = dp[y][0];
    48 dis[y][0] = len;
    49 dp[y][0] = dp[x][flag];
    50 }
    51 else if(len == dis[y][0])
    52 {
    53 dp[y][0] += dp[x][flag];
    54 }
    55 else if(len < dis[y][1])
    56 {
    57 dis[y][1] = len;
    58 dp[y][1] = dp[x][flag];
    59 }
    60 else if(len == dis[y][1])
    61 {
    62 dp[y][1] += dp[x][flag];
    63 }
    64 }
    65 }
    66 int ans;
    67 if(dis[T][0] + 1 == dis[T][1])
    68 ans = dp[T][0] + dp[T][1];
    69 else
    70 ans = dp[T][0];
    71 return ans;
    72 }
    73 int main()
    74 {
    75 int i,j;
    76 int ca;
    77 scanf("%d",&ca);
    78 while(ca --)
    79 {
    80 scanf("%d %d",&n,&m);
    81 memset(box,-1,sizeof(box));
    82 for(i = 1;i <= m;i ++)
    83 {
    84 int a,b,c;
    85 scanf("%d %d %d",&a,&b,&c);
    86 Edge[i].u = b;
    87 Edge[i].val = c;
    88 Edge[i].next = box[a];
    89 box[a] = i;
    90 }
    91 scanf("%d %d",&S,&T);
    92 printf("%d\n",Dijstra(S,T));
    93 }
    94 return 0;
    95 }

  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/zhangteng512/p/2189332.html
Copyright © 2011-2022 走看看