无向图最小环问题

本文探讨了无向图中寻找至少包含3个节点且边和最小的环的问题,阐述了输入输出格式及数据范围。通过示例输入和输出,解释了解题思路,强调了易错点,并提供了两种不同的解题代码实现。
摘要由CSDN通过智能技术生成

给定一张无向图,求图中一个至少包含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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Floyd算法找到无向图最小,可以先使用Floyd算法求出图任意两个顶点之间的最短路径,然后再遍历所有的三角形(三个顶点组成的)找到最小。 以下是一个使用Python实现Floyd算法求解无向图最小的示例: ```python INF = float('inf') def floyd(graph): n = len(graph) dist = [[INF] * n for _ in range(n)] # 初始化距离矩阵 next_vertex = [[-1] * n for _ in range(n)] # 记录最短路径上的下一个顶点 # 初始化距离矩阵和下一个顶点矩阵 for i in range(n): for j in range(n): if i == j: dist[i][j] = 0 elif graph[i][j] != 0: dist[i][j] = graph[i][j] next_vertex[i][j] = j # 使用Floyd算法计算最短路径和下一个顶点 for k in range(n): for i in range(n): for j in range(n): if dist[i][j] > dist[i][k] + dist[k][j]: dist[i][j] = dist[i][k] + dist[k][j] next_vertex[i][j] = next_vertex[i][k] return dist, next_vertex def find_min_cycle(graph): n = len(graph) min_cycle_length = INF dist, next_vertex = floyd(graph) # 遍历所有三角形,找到最小 for u in range(n): for v in range(u+1, n): for w in range(v+1, n): if graph[u][v] != 0 and graph[v][w] != 0 and graph[w][u] != 0: cycle_length = dist[u][v] + dist[v][w] + dist[w][u] - 2 * (graph[u][v] + graph[v][w] + graph[w][u]) if cycle_length < min_cycle_length: min_cycle_length = cycle_length return min_cycle_length ``` 使用上述代码,可以通过传入一个邻接矩阵表示的无向图,来计算出最小的长度。其,`graph`是一个二维列表,表示图的邻接矩阵,如果两个顶点之间没有边,则对应位置的值为0。 注意,这里的最小指的是由三个顶点组成的,并且每个顶点都与相邻的两个顶点相连。如果图不存在这样的,则返回无穷大(INF)。 希望能够帮助到你!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值