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 }

  • 相关阅读:
    react native配置ip真机测试
    APP Store上架QA&注意事项
    iOS 开发】解决使用 CocoaPods 执行 pod install 时出现
    iphoneX适配!!!
    better-scroll和swiper使用中的坑
    js知识巩固
    vue的学习(常用功能)
    vue学习生命周期(created和mounted区别)
    jq常用功能操作
    移动端中遇到的坑(bug)!!!
  • 原文地址:https://www.cnblogs.com/zhangteng512/p/2189332.html
Copyright © 2011-2022 走看看