给定一张无向图,求图中一个至少包含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
题解:无向图的最小环问题,i—j, k围城一个环,i通过无数个k到达j,这是经过的每条路径,再加上i到j的最短距离,就是最小环的路径长度,当然,这道题不是求长度,而是求路径经过的点,用一个数组记录就好了
这题有一个非常容易错的点。在代码中标注
代码一:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll a[1010][1010],dis[1010][1010],e[5100],n,nex[1010][1010],m,t1,t2,t3;
int main()
{
while(~scanf("%lld%lld",&n,&m))
{
memset(a,0x3f,sizeof(a));
memset(dis,0x3f,sizeof(dis));
ll i,j,k;
for(i=1; i<=m; i++)
{
scanf("%lld%lld%lld",&t1,&t2,&t3);
dis[t1][t2]=dis[t2][t1]=a[t1][t2]=a[t2][t1]=min(a[t1][t2],t3);
nex[t1][t2]=t2;
nex[t2