Floyd算法求图最小环

原创 2018年04月15日 06:00:12

观光旅游

Time Limit:1000MS  Memory Limit:65536K
Total Submit:1 Accepted:0

Description


背景 Background 
  湖南师大附中成为百年名校之后,每年要接待大批的游客前来参观。学校认为大力发展旅游业,可以带来一笔可观的收入。 
描述 Description 
  学校里面有N个景点。两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度;否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从I到J有直接的道路,那么从J到I也有,并且长度与之相等。学校规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Xiaomengxian决定到湖南师大附中旅游。由于他实在已经很累了,于是他决定尽量少走一些路。于是他想请你——一个优秀的程序员——帮他求出最优的路线。怎么样,不是很难吧?(摘自《郁闷的出纳员》) 

Input

第一行有两个正整数N,M,分别表示学校的景点个数和有多少对景点之间直接有边相连。(N<=100,M<=10000) 
以下M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度。

Output

输出一行: 
如果该回路存在,则输出一个正整数,表示该回路的总长度;否则输出“No solution.”(不要输出引号)

Sample Input

5 6
1 4 1
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20

Sample Output

61

最小 环问题

一个环中的最大节点为k(编号最大),与它相连的两点i,j,这个环的最短长度为g[i][k]+g[k][j]+i到j的路径中,所有编号都小于k的最短路径长度。

根据floyd原理,在最外层循环做了k-1次之后,dis[i][j]就代表了i到j路径中所有节点编号小于k的最短路径。

#include<bits/stdc++.h>
using namespace std;
int dis[111][111],e[111][111];
int n,m;
int main()
{
    int a,b,c;
    while(cin>>n>>m){
        memset(dis,0x3f,sizeof(dis));
        memset(e,0x3f,sizeof(e));
        for(int i=0;i<m;i++){
            cin>>a>>b>>c;
            e[a][b]=c;
            e[b][a]=c;
            dis[a][b]=c;
            dis[b][a]=c;
        }
        int ans=0x3f3f3f3f;
        for(int k=1;k<=n;k++){
            for(int i=1;i<=k-1;i++)
            {
                for(int j=i+1;j<=k-1;j++){
                    ans=min(ans,dis[i][j]+e[i][k]+e[k][j]);
                }
            }
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++){
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
        if(ans==0x3f3f3f3f) cout<<"没有最小环"<<endl;
        else{
            cout<<"最小环长度为:"<<ans<<endl;
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35710556/article/details/79946299

poj&nbsp;1734&nbsp;Floyd算求有向图的最小环

题意:旅游公司要开发一条新的路线 , 要求这是一个总路程尽可能短的环 , 并且不能只含两个城市 , 除开起点外 , 不能重复走之前走过的城市 , 输出这条路线? Floyd算法求最小环 代码: ...
  • zengchenacmer
  • zengchenacmer
  • 2013-12-14 20:05:28
  • 1196

floyd最小环 详细讲解

转载自:http://m.blog.csdn.net/blog/qq909157370/9225109# hdu 1599 find the mincost route(找无向图最小环) ...
  • Olga_jing
  • Olga_jing
  • 2015-11-19 15:31:49
  • 3076

多源最短路·floyd && 最小环算法

其实我已经会了。。但今天写错了一次。。。。实在恐怖。。所以我决定还是深度解析这个floyd算法 Floyd-warshall 1.摆出问题 先摆出最简单问题,给你图,询问a,b求a,b间最短路 不会f...
  • u011229924
  • u011229924
  • 2014-02-16 12:40:49
  • 1141

Floyd最小环算法

问题描述: 给你一张无向图,定义环为从i出发到达j然后从j返回i并且所有点都只经过一次(最少为3个点),求所有环当中经过路径                   最小的环 算法描述:首先容易想到的是暴...
  • qq_34731703
  • qq_34731703
  • 2017-01-25 13:07:29
  • 1153

求无向图最小环算法-floyd

floyd算法。有 i 出发返回 i 的最小环=min{d[i][j]+map[i][k]+map[k][j]};for(k=1;k
  • qq_33583069
  • qq_33583069
  • 2016-07-18 09:05:42
  • 1359

Floyd求最小环

ACM模版Floyd求最小环令e(u, v)表示u和v之间的连边,令min(u, v)表示删除u和v之间的连边之后u和v之间的最短路, 最小环则是min(u, v) + e(u, v). 时间复杂度是...
  • f_zyj
  • f_zyj
  • 2016-07-18 11:52:11
  • 1000

Floyd算法求图最短路径及实现

最短路径搜索是基于Floyd算法的改进。Floyd算法的基本思想 图1 选i到j的最短路径 Floyd算法的基本思想是:比较直接从i到j和从i经k到j的路径长度,选择较短的一条。当此条最短路径选...
  • LoHiauFung
  • LoHiauFung
  • 2016-12-06 15:51:51
  • 1752

邻接多重表创建图,Floyd算法求最短路径

  • 2011年06月13日 12:33
  • 403KB
  • 下载

Floyd算法求图的传递闭包

Floyd算法的一个应用吧 /* 设R是非空集合上的关系,R的传递闭包是A上的关系R',使得R'满足以下条件: 1)、R'是传递的 2)、R是R'的子集 3)、对A上的任何包含R的传递关系R'',有...
  • Kay_Sprint
  • Kay_Sprint
  • 2012-03-01 21:15:11
  • 1223

Floyd算法求最小环

/* *算法引入: *求一个图G中的最小环路的朴素算法为:每次找到一条边,删除了求这两点之间的最短路径; *若能求出,则这条最短路径与原来的边构成一个环,不过时间复杂度略高; * *算法思想...
  • Jarily
  • Jarily
  • 2013-05-01 17:21:50
  • 7109
收藏助手
不良信息举报
您举报文章:Floyd算法求图最小环
举报原因:
原因补充:

(最多只允许输入30个字)