首页 > 其他 > 详细

D - Harmonious Graph

时间:2019-11-23 22:53:34      阅读:84      评论:0      收藏:0      [点我收藏+]

题目大意:

n个点,m条边,两个数l和r,如果l和r相连接,那么对于l和r之间值任意一个数都要和l相连。问达到这一目的需要添加的边的最小数量。

题解:

我们首先要找到当前连通块中最大的那个点,也就是说所有小于当前点的点都要和这个点相连,如果不相连的话,加一条边,所以用我们可以用一个mark数组来标记当前当前点是否在当前联通块中,如不在的话,并且当前点的大小小于联通块的最大点的大小,我们就要加一条边。可以用dfs来遍历联通块

#include<bits/stdc++.h>
using namespace std;
const int N=2E5+7;
vector<int >ve[N];
int mark[N];
int s=0;
void dfs(int x){
    mark[x]=1;
    s=max(s,x);
    for(int i=0;i<ve[x].size();i++){
        int a=ve[x][i];
        if(!mark[a]) dfs(a);
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++) {
        cin>>x>>y;
        ve[x].push_back(y);
        ve[y].push_back(x);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(mark[i]) continue ;
        if(i<s){
            ve[i].push_back(s);
            ve[s].push_back(i);
            ans++;
        }
        dfs(i);
    }
    cout<<ans<<endl;
    return 0;
}

太秒啦!!!!

D - Harmonious Graph

原文:https://www.cnblogs.com/Accepting/p/11919810.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!