观光之旅(最小环)

  1. 观光之旅

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

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

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

输入格式
第一行包含两个整数 N 和 M,表示无向图有 N 个点,M 条边。

接下来 M 行,每行包含三个整数 u,v,l,表示点 u 和点 v 之间有一条边,边长为 l。

输出格式
输出占一行,包含最小环的所有节点(按顺序输出),如果不存在则输出 No solution.。

数据范围
1≤N≤100,
1≤M≤10000,
1≤l<500
输入样例:
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
输出样例:
1 3 5 2
思路分析:考虑Floyd算法的过程。当外层循环的k刚开始时,d[i,j]的意义为从起点i,只经过1-k,到达j的最短路径,得到最终的动态规划表达式d[k,i,j]=min(d[k,i,j],d[k-1,i,k]+d[k-1,k,j]),我们通过分析可以得出可以把第一维省去,得到Floyd最短路的表达式为d[i,j]=min(d[i,j],d[i,k]+d[k,j]),我们可以这样来求解最小环,以在一个最小环中最大的点为k,构成至少为三点i,j,k的最小环,于是我们可以枚举k求得最小环的长度之和最小值,由于在这个题中我们需要记录最小环的方案,所以我们可以用一个二维数组来记录每次转移的点k,最后递推回去得到方案,而在枚举时由于是无向图,所以我们只需要枚举一半即可,无向图是对称的

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=110,INF=0x3f3f3f3f;

int n,m;
int g[N][N],d[N][N],path[N];//用path记录方案
int cnt,pos[N][N];//用pos记录每次转移的k值

void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值