Acwing 344.观光之旅

题意

给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。

该问题称为无向图的最小环问题。

你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。

1≤N≤100,1≤N≤100,1≤N≤100,
1≤M≤10000,1≤M≤10000,1≤M≤10000,
1≤l<5001≤l<5001≤l<500

思路

将所有环 按照环上最大的点的编号 分成n类,1,2,3…,n-1,n

对于FloydFloydFloyd 的三重循环

for(k=1->n)for(i=1->n)for(j=1->n)

可以知道当最外层循环到第 k 轮时,代表第 k 类环,即环上的点的编号最大为 k,因为此时所有最短路只被 1∼k−11 \sim k - 11∼k−1松弛过

这样一类环可以表示成下述形式:

所以第k类的环的距离可以表示成 d[i][j] + g[i][k] + g[k][i] ,其中d为最短路径数组,g为原图

对每一类环枚举小于 k 的每两个点对(因为环上最大的点为 k),取min即可得到答案。

本题需要求具体方案,

在 floydfloydfloyd 算法中,存在一个三角不等式 d[i][j] >= d[i][k] + d[k][j]

当某一 k 满足 d[i][j] = d[i][k] + d[k][j] 时,说明 k可以使得 从 ij 的距离最小,那么 从 ij 的最短路径一定包含 k,我们用 pos[i][j] = k 表示,i - j 的路径是从 k 更新过去的。

所以对于从 i - j 的最短路径,可以通过递归的方法求出经过的所有点。

最短路径上的点加上之前叙述的 环上的 k ,即为环上的所有点。

代码

// Author:zzqwtcc
// Problem: 观光之旅
// Contest: AcWing
// Time:2021-10-18 22:04:48
// URL: https://www.acwing.com/problem/content/346/
// Memory Limit: 64 MB
// Time Limit: 1000 ms#include<bits/stdc++.h>
#include<unordered_map>
// #define int long long
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
#define debug(x,y) cerr << (x) << " == " << (y) << endl;
#define endl '\n'
using namespace std;typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
// template<typename T> T qmi(T a, T b = mod - 2, T p = mod) { T res = 1; b %= (p - 1 == 0 ? p : p - 1); while (b) { if (b & 1) { res = (LL)res * a % p; }b >>= 1; a = (LL)a * a % p; }return res % mod; }const int N = 110;
int n, m;
int g[N][N],d[N][N];
int path[N],cnt;
int pos[N][N];void get_path(int i,int j){if(pos[i][j] == 0)return ;int k = pos[i][j];get_path(i,k);path[cnt++] = k;get_path(k,j);
}void solve() {cin >> n >> m;memset(g,0x3f,sizeof g);rep(i,1,n)g[i][i] = 0;while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a][b] = g[b][a] = min(g[a][b],c);}memcpy(d,g,sizeof d);int res = INF;for(int k = 1; k <= n;++k){for(int i = 1; i < k;++i){for(int j = i + 1; j < k;++j){if((LL)d[i][j] + g[j][k] + g[k][i] < res) {res = d[i][j] + g[i][k] + g[k][j];cnt = 0;path[cnt++] = k;path[cnt++] = i;get_path(i,j);path[cnt++] = j;}}}for(int i = 1; i <= n;++i){for(int j = 1; j <= n;++j){if(d[i][j] > d[i][k] + d[k][j]){d[i][j] = d[i][k] + d[k][j];pos[i][j] = k;}}}}if(res == INF)puts("No solution.");else {for(int i =0 ; i < cnt;++i){printf("%d ",path[i]);}cout << endl;}
}signed main() {//int _; cin >> _;//while (_--)solve();return 0;
}

Acwing 344.观光之旅(Floyd求最小环)相关推荐

  1. 多源最短路径Floyd、Floyd求最小环【模板】

    Floyd算法:用来找出每对点之间的最短距离.图可以是无向图,也可以是有向图,边权可为正,也可以为负,唯一要求是不能有负环.  1.初始化:将Map[][]中的数据复制到Dist[][]中作为每对顶点 ...

  2. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  3. floyd求最小环 模板

    http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...

  4. 最小环 floyd java_干货|Floyd求最小环(CF Shortest Cycle)

    作者:Water_Fox 来源:牛客网 You are given nn integer numbers a1,a2,-,ana1,a2,-,an. Consider graph on nn node ...

  5. hdu 1599(Floyd求最小环)

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. floyd求最小环——poj1734Sightseeing trip

    题目链接 Description There is a travel agency in Adelton town on Zanzibar island. It has decided to offe ...

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

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

  8. POJ1734(floyd求最小环的路径)

    题目:Sightseeing trip 题意:求一个图中最小环,输出路径. #include <iostream> #include <string.h> #include & ...

  9. POJ1734 Sightseeing trip floyd求最小环问题

    问题描述 m个点, m条边, 求图中存在的路径最小的环 样例 Sample Input 5 7 1 4 1 1 3 300 3 1 10 1 2 16 2 3 100 2 5 15 5 3 20 Sa ...

最新文章

  1. SharePoint 2013 图文开发系列之创建内容类型
  2. 学习笔记Spark(十)—— Spark MLlib应用(2)—— Spark MLlib应用
  3. git 提交修改到github上
  4. [html] 说说你对短链接的理解,它有什么应用场景呢?
  5. 前端学习(2517):子传父
  6. 面向对象方法使用gluon
  7. java邮箱exchange_使用Javamail访问Microsoft Exchange邮箱(IMAP,MS Exchange)
  8. Material Theme
  9. c语言实现61850协议,C语言实现61850库实现代码
  10. ubuntu等linux系统如何阅读caj文档
  11. triton部署yolov5笔记(四)
  12. dell5580bios恢复出厂_戴尔笔记本如何恢复Bios出厂设置?
  13. Jmeter配置元件之HTTP授权管理器与 HTTP缓存管理器-19
  14. mysql 测试数据库employees导入
  15. TCPIP详解Protocol 读书笔记(八) Traceroute程序
  16. oracle rr与yy日期格式
  17. 关于AttributeError: module ‘torch.nn‘ has no attribute ‘Moudle‘的解决方法
  18. 下一代共识机制探究——基于DAG的BFT共识
  19. Cadence Allegro输出钻孔信息文件图文教程及视频演示
  20. 飞天遁地、来去自如?Oracle数据库秉承技术当先,用户也来说说看

热门文章

  1. 荣耀v10图片是html格式,就长这样?荣耀V10真机图赏
  2. 撩妹子成功率提高99.89%的方法
  3. Excel常用函数公式10例
  4. 计算机英语教程哪个好,目前国内大学计算机英语教程教学情况分析
  5. 洛谷P4113 [HEOI2012]采花 题解
  6. 刷题找工作《买卖股票问题》一文通解
  7. android 创建aar包
  8. 行业观点|鞋企转战个性化定制 打响新消费时尚
  9. 利用python计算圆球的体积_Python 实例:概率计算
  10. java读取并修改xml文件