1253D. Harmonious Graph
题意:给定n点m边图。问最少添加几条边,使变为平衡图。即若a~b联通,[a,b]中的所有点可达。
第一反应并查集。思路是没错的但是后来越想越乱,以后一定记得那样例人工模拟一下再码。
思路:
一开始用并查集把所有路都联通,大的都指向小的。
然后倒序遍历:从n开始找到他的最前面的点也就是这个连通块的起始点x=fin(i),从x到i之间的所有点的起始点都应该是x。
如果有一个点的起点不是x,设为fx,就更新:将fx和x中的大的值指向小的。同时把x更新为min(fx,x)
int f[maxn];
int fin(int x){
if(f[x]==x)
return x;
return f[x]=fin(f[x]);
}
int main(){
int n=ird(),m=ird(),x,y,fx,fy;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++){
x=ird(),y=ird();
fx=fin(x);fy=fin(y);
if(fx!=fy){
f[max(fx,fy)]=min(fx,fy);
}
}
int ans=0;
for(int i=n;i>=1;i--){
x=fin(i);
while(x<i){
i--;
fx=fin(i);
if(fx!=x){
ans++;
f[max(fx,x)]=min(fx,x);
x=min(fx,x);
}
}
}
cout<<ans<<endl;
return 0;
}