• [POJ-1734]Sightseeing trip


    题目传送门

    这道题很好地利用了Floyd的思想,我们要明白Floyd中dist[i][j]的含义:在外层循环变量为k时,dist[i][j]表示只经过编号不大于k号的节点,i->j的最短路,根据这个性质,我们不难想到在以k为中转点松弛之前,先以k为中转点看最小环(因为还没经过k号节点,从而保证了正确性)之后我们考虑打印路径,在伟大的高老师和伟大的CZD神犇以及伟大的小班点拨下,我终于明白了怎么打印路径,首先开一个二维数组way,way[i][j]就表示当前i到j最短路中的中转点,当这个值为零时,就证明i,j不连通或者走图中的边即为最短路。递归打印i到中转点的路和中转点到k的路即可。

    下面给出参考代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int f[101][101],dist[101][101],n,m,way[101][101],x,y,z,ans=21374404,num,l,r,path[10001];//求最小环,赋21374404~~~cjx
     5 void getpath(int a,int b)
     6 {
     7     if(!way[a][b])return;
     8     getpath(a,way[a][b]);
     9     path[++num]=way[a][b];
    10     getpath(way[a][b],b); 
    11 }
    12 int main()
    13 {
    14     memset(f,20,sizeof(f));
    15     memset(dist,20,sizeof(dist));
    16     cin>>n>>m;
    17     for(int i=1;i<=m;i++)
    18     {
    19         cin>>x>>y>>z;
    20         f[x][y]=f[y][x]=min(z,f[x][y]);
    21         dist[x][y]=dist[y][x]=f[x][y];
    22     }
    23     for(int i=1;i<=n;i++)dist[i][i]=0;
    24     for(int k=1;k<=n;k++)
    25     {
    26         for(int i=1;i<=n;i++)
    27         {
    28             for(int j=1;j<=n;j++)
    29             {
    30                 if(ans>dist[i][j]+f[i][k]+f[k][j]&&i!=j&&i!=k&&j!=k)
    31                 {
    32                     ans=dist[i][j]+f[i][k]+f[k][j];
    33                     num=0;
    34                     path[++num]=j;
    35                     path[++num]=k;
    36                     path[++num]=i;
    37                     getpath(i,j);
    38                 }
    39             }
    40         }
    41         for(int i=1;i<=n;i++)
    42         {
    43             for(int j=1;j<=n;j++)
    44             {
    45                 if(dist[i][j]>dist[i][k]+dist[k][j])
    46                 {
    47                     dist[i][j]=dist[i][k]+dist[k][j];
    48                     way[i][j]=k;
    49                 }
    50             }
    51         }
    52     }
    53     if(ans==21374404)
    54     {
    55         cout<<"No solution.";
    56         return 0;
    57     }
    58     for(int i=1;i<=num;i++)
    59     {
    60         cout<<path[i]<<" ";
    61     }
    62     return 0;
    63 }
    View Code

      

  • 相关阅读:
    6、redux源码解析
    5、redux源码解析
    4、redux源码解析
    3、redux码源
    2、redux源码探索
    1、redux源码探索
    Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    Linux命令——whereis
    Linux命令——which
    Linux命令——tail
  • 原文地址:https://www.cnblogs.com/szmssf/p/11053973.html
Copyright © 2020-2023  润新知