D - Harmonious Graph(并查集)(此题需补)
题意:一共n个点,m条线
若点a连通点b 则对于任何a<c<b,a均与b连通,若不连通,则你需要加边上去
问你需要加多少条边
采用并查集是因为 对于所有小于b并且与b连通的a 均用并查集代替
而其中一个点并查集不等于最大的b时 就需要加边上去 ans++
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 2e5+10;
int f[maxn];
int n,m;
int Find(int x)
{
if(f[x]==x) return x;
f[x]=Find(f[x]);
return f[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;
while(m--)
{
int x,y,fx,fy;
cin>>x>>y;
fx=Find(x);
fy=Find(y);
if(fx>fy) swap(fx,fy);
f[fx]=fy;
}
int ans=0;
for(int i=1;i<=n;i++)
{
int x=Find(i);
while(i<x)
{
int y=Find(i);
if(x!=y)
{
ans++;
if(x<y) swap(x,y);
f[y]=x;
}
i++;
}
}
cout<<ans<<endl;
return 0;
}
吾志所向
一往无前
愈挫愈奋
再接再励
——卓

浙公网安备 33010602011771号