无向图最小环问题

Problem G. Pandaland

题意
直角坐标系中有一些点,每个点有个坐标。
一共 m 条边,每条边连接两个点 x i , y i x_i, y_i xi,yi,有权值 w i w_i wi
问,图中是否存在环,如果存在的话权值最小为多少?

1 ≤ T ≤ 50. 1 ≤ T ≤ 50. 1T50.
1 ≤ m ≤ 4000. 1 ≤ m ≤ 4000. 1m4000.
− 10000 ≤ x i , y i ≤ 10000 ,   1 ≤ w ≤ 1 0 5 −10000 ≤ x_i, y_i ≤ 10000,\ 1 ≤ w ≤ 10^5 10000xi,yi10000, 1w105

思路

在找题解的过程中,发现用 dijkstra 求最小环的做法也是可以解决这道题的。
复杂度不是 O(n*mlogn) 或者 O(m^2logn) 吗?为什么能解决这道题呢?剪枝一下

这里采用枚举所有边,求一个端点到另一个端点的最短距离+边权的 O(m^2logn) 的做法求解。

需要知道 dijkstra 求解最短路的一个性质:依次出队的节点距离是递增的,按距离递增的顺序更新各个节点。
这就说明,如果发现 当前出队的节点距离+枚举的边权 已经超过之前求得的最小环权值了ans,那么当前边求出的答案一定大于 ans 了,就没有搜下去的必要了,直接 return。

神奇的剪枝!

#include<bits/stdc++.h>
using namespace std;

#define Ios ios::sync_with_stdio(false),cin.tie(0)
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define endl '\n'

const int N = 200010, mod = 1e9+7;
int T, n, m;
int a[N];
map<PII, int> mp;
struct node{
   
   
	int x, y;
	int w;
}edg[N];
int dist[N], f[N];
vector<PII> e[N
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值