题目描述
给定一张无向图,求图中一个至少包含3个点的环,环上的节点不重复,并且环上的边的长度和最小。该问题被称为无向图的最小环问题。在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。若无解,输出 。
输入格式
第一行包含两个正整数和,分别表示图中有个节点条边。接下来行每行三个正整数,描述一条与之间权值为的无向边。
输出格式
输出仅一行,包含 或若干个空格隔开的正整数,以描述所求的最小环。
若有多种方案,仅要求输出任意一种。对于任意一种方案,请按环上的遍历顺序输出编号。
样例
Input
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
Output
1 3 5 2
题面描述的还是很清晰的,需要我们去找最小环,考虑用floyd,遍历找环的同时更新边的最小值。关于方案的记录,我们可以开一个pre数组记录当前路径中终点的上一个点,之后一个一个往前找就行了。
c o d e code code
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1e5+10,Inf=0x3f3f3f3f;
int n,m,pre[N][N];
long long dis[N][N],mp[N][N],minn=Inf;//这里开long long是因为在后面更新过程中相加会爆int。当然你也可以把Inf设得小一点,然后用int
int cnt,path[N],vis[N][N];
void floyd()
{
for