P11005 题解
题意
给出一张
思路
考虑转化条件,不难发现
那么按照边权从小到大加入每一条边,当加入一条边权为
按边权排序后依次加边,用并查集维护连通块及大小,在
代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=2e5+10;
const int inf=2e18;
int n,m,l,r,res,f[N],s[N];
struct edg {int u,v,w;}e[N];
bool cmp(edg ta,edg tb) {return ta.w<tb.w;}
int finds(int x) {return (f[x]==x?x:f[x]=finds(f[x]));}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m>>l>>r,e[m+1].w=inf;
for(int i=1;i<=n;i++) f[i]=i,s[i]=1;
for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
sort(e+1,e+1+m,cmp); int now=1;
while(e[now].w<=r)
{
int fu=finds(e[now].u),fv=finds(e[now].v);
if(fu!=fv)
{
if(e[now].w>=l) res+=s[fu]*s[fv];
f[fu]=fv,s[fv]+=s[fu];
}
now++;
}
cout<<res;
return 0;
}