zoukankan      html  css  js  c++  java
  • poj1734 Sightseeing trip(Floyd求无向图最小环)

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <vector>
     6 using namespace std;
     7 
     8 typedef long long ll;
     9 const int maxn = 100 + 5;
    10 const int inf = 0x3f3f3f3f;
    11 int n, m, ans;
    12 int mp[maxn][maxn], dis[maxn][maxn], pos[maxn][maxn];
    13 vector<int> path;    //记录路径
    14 inline void getpath( int x, int y ){
    15     if( pos[x][y]==0 ) return;
    16     getpath( x, pos[x][y] );
    17     path.push_back(pos[x][y]);
    18     getpath( pos[x][y], y );
    19 }
    20 
    21 inline void floyd(){
    22     ans = inf;
    23     for( int k=1; k<=n; k++ ){
    24         for( int i=1; i<k; i++ )
    25             for( int j=i+1; j<k; j++ )
    26                 if( (ll)dis[i][j] + mp[j][k] + mp[k][i] < ans ){
    27                     ans = dis[i][j]+mp[j][k]+mp[k][i];  
    28                     path.clear();      //发现更优起点,清除之前路径
    29                     path.push_back(i);   //该行到32行 按顺序插入才能构成环
    30                     getpath( i, j );
    31                     path.push_back(j);
    32                     path.push_back(k);
    33                 }
    34         for( int i=1; i<=n; i++ )
    35             for( int j=1; j<=n; j++ )
    36                 if( dis[i][j] > dis[i][k]+dis[k][j] ){  //此处要按dis[i][k]+dis[k][j]更新最短距离 而不是mp[i][k]+mp[k][j]
    37                     dis[i][j] = dis[i][k]+dis[k][j];
    38                     pos[i][j] = k;
    39                 }
    40     }
    41 }
    42 
    43 int main(){
    44     scanf("%d%d", &n, &m);
    45     memset( mp, inf, sizeof(mp) );
    46     memset( pos, 0, sizeof(pos) );
    47     for( int i=0; i<=n; i++ ) mp[i][i] = 0;
    48     for( int i=0; i<m; i++ ){
    49         int u, v, w;
    50         scanf("%d%d%d", &u, &v, &w);
    51         if( w<mp[u][v] ) mp[u][v] = mp[v][u] = w;
    52      }
    53     memcpy( dis, mp, sizeof(mp) );
    54     floyd();
    55     if( ans==inf ){
    56         puts("No solution.");
    57         return 0;
    58     }
    59     for( int i=0; i<path.size(); i++ )
    60         printf("%d ", path[i]);
    61     puts("");
    62 
    63     return 0;
    64 }
    65 
    66 /*
    67 Sample Input
    68 5 7
    69 1 4 1
    70 1 3 300
    71 3 1 10
    72 1 2 16
    73 2 3 100
    74 2 5 15
    75 5 3 20
    76 
    77 Sample Output
    78 1 3 5 2
    79 */
  • 相关阅读:
    Ubuntu 中软件的安装、卸载以及查看的方法总结
    无锁队列的环形数组实现
    Geodatabase模型
    地图投影与ArcGIS坐标系转换
    ARCGIS动态画点
    ArcEngine数据删除几种方法和性能比较
    AE开发技术文档--8种数据访问方法
    Hibernate 的HQL和sql有什么区别
    ActionContextCleanUp作用
    Hibernate延迟加载与opensessioninviewFilter
  • 原文地址:https://www.cnblogs.com/WAautomaton/p/10845771.html
Copyright © 2011-2022 走看看