zoukankan      html  css  js  c++  java
  • [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

      

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/szmssf/p/11053973.html
Copyright © 2011-2022 走看看