什么是最小环?就是所有组成环的环,边权值最小的环,就是最小环。

我们由一道题,进入这个问题。

链接:hdu1599

find the mincost route

Time Limit: 1000/2000 MS (Java/Others) , Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8189 , Accepted Submission(s): 3100

Problem Description
杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,…VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。

Input
第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。

Output
对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It’s impossible.".

Sample Input
3 3
1 2 1
2 3 1
1 3 1

3 3
1 2 1
1 2 3
2 3 1

Sample Output
3
It’s impossible.

题意很简单,我们可以看出就是一个最小环寻找问题。

求最小环我们可以利用floyd来求,什么你还不会Floyd?(自己看书)

其实Floyd很简单,用四行代码就能解决。

for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=g[j][i]=min(g[i][j],g[i][k]+g[k][j]);

思路也十分简单,就是利用一个点k,看i,j之间的路径能否通过k点中转,使得i,j之间的路径变短。

这里我们探讨怎么利用floyd求最小环。

我们来分析下floyd的实现过程,当枚举顶点k之前我们已经求得了顶点为1 - k-1 的最短路,所以我们可以在跟新k之前枚举k之前的i和j的组合,我们可以知道dis[i][j]没有经过k点,所以我们就可以知道,如果dis[i][j]+mp[i][k]+mp[k][j] != inf(mp[i][j]为没有跟新得边值) 时就存在一条经过ijk的最小环,所以我们要求的是所有环当
中最小的哪一个!

所以有了以下AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int inf=1e8;//这里真的超级坑,不能像以前写成0x3f3f3f3f,因为会爆int
int n,m,mp[N][N],g[N][N],res=inf;
void floyd()
{res=inf;for(int k=1;k<=n;k++){for(int i=1;i<k;i++)for(int j=i+1;j<k;j++)res=min(res,g[i][j]+mp[i][k]+mp[k][j]);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=g[j][i]=min(g[i][j],g[i][k]+g[k][j]);}
}
int main()
{while(cin>>n>>m){for(int i=1;i<=n;i++)  for(int j=1;j<=n;j++)    if(i!=j)   mp[i][j]=g[i][j]=inf;while(m--){int u,v,w;cin>>u>>v>>w;mp[u][v]=mp[v][u]=g[u][v]=g[v][u]=min(w,mp[u][v]);}floyd();if(res==inf)    cout<<"It's impossible."<<endl;else  cout<<res<<endl;}return 0;
}

最小环问题(无向图)相关推荐

  1. hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)

    ps(我到今天才知道Floyd的核心思想是动态规划==) hdu 1599 find the mincost route(找无向图最小环) 注意!这里写成   #define data 0x3f3f3 ...

  2. 【UOJ 276】无向图最小环

    [题目描述]: 给定一张无向图,求图中一个至少包含 3个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的边权之和.若无解,输出 &quo ...

  3. 无向图:查找最小环集合(最短路径回溯算法)

    在无向图中查找最小环,就像需要查找一个蜂窝中所有孔洞,如果只查找数目,可以利用欧拉公式,若查找到所有环,需要更进一步的搜索. 方法:寻找到所有顶点的最短路径,对每一个顶点,取出环,循环删除顶点,输出所 ...

  4. Floyd算法求无向图最小环

    原理可看菊苣博文:http://www.cnblogs.com/khan724/p/4383686.html 自己代码中解释一些小细节.该算法适用于无向图,而有向图的最小环,实际上就是初始化所有点为i ...

  5. 算法 图中求最小环路径 最小环个数 最大平均环 求简单无向图中环的个数

    最小环问题:求个图中环路径代价最小的回路. 如何求最小环?假如有 路径1->3->2,如果此时已经知道2-1的最短路径就好了. 回想下floyed的更新过程,就会发现更新第k次时,比k小的 ...

  6. 【POJ1734】Sightseeing Trip 无向图最小环

    题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...

  7. 无向图最小环——Floyd解法

    题目链接 简单讲一下题意: 给n(<=1e5)个数,数字范围(1e18)任意两个数字之间如果经过与运算以后不为0则可以判为两点相连,给出最小环大小,如果没有则输出-1: 第一步将1e5变小,可以 ...

  8. 求无向图最小环算法-floyd

    floyd算法. 有 i 出发返回 i 的最小环=min{d[i][j]+map[i][k]+map[k][j]}; for(k=1:k<=n:k++){ for(i=1:i<k:i++) ...

  9. POJ1734无向图求最小环

    题目:http://poj.org/problem?id=1734 方法有点像floyd.若与k直接相连的 i 和 j 在不经过k的情况下已经连通,则有环. 注意区分直接连接和间接连接. * 路径记录 ...

最新文章

  1. Android 使用 setImageResource 清空图片
  2. java oracle分页_oracle 分页存储过程和java代码
  3. [unreal4入门系列之三] 初探UE4安装文件目录结构
  4. 20个非常有用的PHP类库
  5. 一个方法可解决两个问题:1:Unity打开时一直加载,不能NEW,只能OPEN; 2:Unity 出现license error,re-active时一直循环报错
  6. sqlserver 安装共享功能什么意思_科普:网格屏是什么意思?LED网格屏怎么安装...
  7. [批处理]自动设置本机系统代理服务器
  8. Spark最新的两大研发方向深度学习和结构化流处理
  9. oracle 分区字符转换,Oracle 普通表与分区表转换
  10. 收藏 | 深度学习检测小目标常用方法
  11. shell 基本命令linux,Linux基础知识:shell基础命令
  12. 华为Mate 30 Pro前面板曝光:双曲面设计 几乎全是屏
  13. 数据结构 二叉树面试笔试编程题集
  14. Android调用系统相册、拍照以及裁剪最简单的实现(兼容7.0)
  15. 使用声波通信技术实现wifi配网
  16. Java 基本数据类型存储位置
  17. 【硬见小百科】二十种电容分类详解!
  18. 怎样建网站?(超详细)
  19. vue 自定义事件 传入额外参数
  20. 65nm粒径量子点MMSNs-HRP-CDs/CP-CDs结合酶/蛋白/荧光的制备过程

热门文章

  1. 2_STM32最小系统设计
  2. EC20 4G 海思 3520D 拨号失败(APN需要设置为三大运营商的指定值)
  3. 基于C语⾔的中间代码⽣成
  4. 调制与解调(一)——模拟调制系统调制解调方法
  5. 最后的巫师猎人 高清BT种子迅雷下载
  6. FTDI BITBANG软件实现i2ctools
  7. 三星 9810 android 9,三星S9双版本对比:骁龙845碾压Exynos 9810
  8. GOOSE报文分析_详解GOOSE服务
  9. POCO库学习教程(一) windows POCO库编译(64位)
  10. 用自己的数据集进行遥感图像分类---------u-net改进版dlinknet