Dijkstra HOJ 2062 -- Help the Hurricane Victims

Dijkstra HOJ 2062 -- Help the Hurricane Victims
Dijkstra 算法
找最短路和次短路
找次短路的方法:将最短路上的边删一条(需要遍历上面的每一条边)再求最短路,找一条最短的。
不明白……
以下是代码
 1  #include  < cstdio >
 2  #include  < cstring >
 3 
 4  const   int  max_num  =   1   <<   30 ;
 5  int  G[ 128 ][ 128 ], pre[ 128 ], yes;                                    //pre存最短路径
 6  int  Dijkstra( int  s,  int  t,  int  n)
 7  {
 8       int  D[ 128 ], flag[ 128 ], temp, now, minmin;
 9       int  i, j;
10       for (i  =   0 ; i  <   128 ; i ++ ) D[i]  =  max_num;
11      D[s]  =   0 ;
12      memset(flag,  0 sizeof (flag));
13      now  =  s;
14      flag[now]  =   1 ;
15       for (i  =   1 ; i  <  n; i ++ )
16      {
17          minmin  =  max_num;
18           for (j  =   1 ; j  <=  n; j ++ )
19          {
20               if (flag[j])  continue
21               if (D[j]  >  G[j][now]  +  D[now])
22              {
23                  D[j]  =  G[j][now]  +  D[now];
24                  pre[j]  =  now;
25              }
26               if (minmin  >  D[j])
27              {
28                  minmin  =  D[j];
29                  temp  =  j;
30              }
31          }
32           if (minmin  ==  max_num)  return   0 ;              //没有路则返回
33          now  =  temp;
34          flag[now]  =   1 ;
35           if (now  ==  t)  break ;
36      }
37       return  D[t];
38  }
39  int  main()
40  {
41       int  n, m, temp, a, b, p[ 128 ], minmin, tempg;
42       int  i, j;
43      
44       while ( 1 )
45      {
46          scanf( " %d%d " & n,  & m);
47           if ( ! &&   ! m)  break ;
48          
49           for (i  =   1 ; i  <=  n; i ++ )
50               for (j  =   1 ; j  <=  n; j ++ )
51                  G[i][j]  =   1   <<   30 ;
52          
53           for (i  =   0 ; i  <  m; i ++
54          {
55              scanf( " %d%d%d " , & a,  & b,  & temp);
56              G[a][b]  =  G[b][a]  =  temp;
57          }
58          temp  =  Dijkstra( 1 , n, n);
59           if ( ! temp)
60          {
61              printf( " Sorry, no different ways available.\n " );
62               continue ;
63          }
64           for (i  =   0 ; i  <   128 ; i ++ ) p[i]  =  pre[i];
65          minmin  =  max_num;
66          yes  =   0 ;
67           for (i  =  n;i  !=   1 ; i  =  p[i])
68          {
69              tempg  =  G[i][p[i]];
70              G[i][p[i]]  =  G[p[i]][i]  =  max_num;
71               int  d  =  Dijkstra( 1 , n, n);
72               if (minmin  >  d  &&  d) 
73              {
74                  minmin  =  d;
75                  yes  =   1 ;
76              }
77              G[i][p[i]]  =  G[p[i]][i]  =  tempg;
78          }
79           if (yes) printf( " %d %d\n " , temp, minmin);
80           else  printf( " Sorry, no different ways available.\n " );
81      }
82       return   0 ;
83  }

你可能感兴趣的:(Dijkstra HOJ 2062 -- Help the Hurricane Victims)