题意
直角坐标系中有一些点,每个点有个坐标。
一共 m 条边,每条边连接两个点 x i , y i x_i, y_i xi,yi,有权值 w i w_i wi。
问,图中是否存在环,如果存在的话权值最小为多少?
1 ≤ T ≤ 50. 1 ≤ T ≤ 50. 1≤T≤50.
1 ≤ m ≤ 4000. 1 ≤ m ≤ 4000. 1≤m≤4000.
− 10000 ≤ x i , y i ≤ 10000 , 1 ≤ w ≤ 1 0 5 −10000 ≤ x_i, y_i ≤ 10000,\ 1 ≤ w ≤ 10^5 −10000≤xi,yi≤10000, 1≤w≤105
思路
在找题解的过程中,发现用 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

最低0.47元/天 解锁文章
6804

被折叠的 条评论
为什么被折叠?



