zoukankan      html  css  js  c++  java
  • NWERC2020J-Joint Excavation【构造,贪心】

    正题

    题目链接:https://codeforces.com/gym/103049/problem/J


    题目大意

    (n)个点(m)条边的一张无向图,选出一条路径后去掉路径上的点,然后将剩下的点分成点数相等的两份使得两份之间没有边连接。

    (1leq n,mleq 2 imes 10^5)


    解题思路

    先跑出(dfs)树,这样就保证了所有的非树边都是返祖边。

    发现如果我们选出树上一条根节点出发的路径那么其他子树之间一定是不连通的(因为要么子树之间有环,要么往上的环被删除)。

    所以问题就变成了选出一条从根出发的路径然后把其他的分成大小相等的两份。

    考虑贪心解决,我们走到一个点时可以把儿子的子树大小从小到大排列,然后两边那边不够就加给哪边,加剩最大的一个再继续往下分。

    因为这样分的差一定不大于最大的那个,所以肯定是对的。


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int N=2e5+10;
    int n,m,siz[N],mark[N];
    vector<int> G[N],T[N],p;
    void dfs(int x,int fa){
    	siz[x]=1;
    	for(int i=0;i<G[x].size();i++){
    		int y=G[x][i];
    		if(y==fa||siz[y])continue;
    		T[x].push_back(y);
    		dfs(y,x);siz[x]+=siz[y];
    	}
    	return;
    }
    bool cmp(int x,int y)
    {return siz[x]>siz[y];}
    void calc(int x,int fa,int a,int b){
    	sort(T[x].begin(),T[x].end(),cmp);
    	p.push_back(x);int lr=0;
    	for(int i=0;i<T[x].size();i++){
    		int y=T[x][i];
    		if(y==fa)continue;
    		if(!lr)lr=y;
    		else if(a<=b)a+=siz[y],mark[y]=1;
    		else b+=siz[y],mark[y]=2;
    	}
    	if(a<=b&&a+siz[lr]==b){mark[lr]=1;return;}
    	if(a>=b&&b+siz[lr]==a){mark[lr]=2;return;}
    	calc(lr,x,a,b);return;
    }
    void print(int x,int fa,int z){
    	if(!mark[x])mark[x]=mark[fa];
    	for(int i=0;i<T[x].size();i++)
    		if(T[x][i]!=fa)print(T[x][i],x,z);
    	if(mark[x]==z)printf("%d ",x);
    	return;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		int x,y;
    		scanf("%d%d",&x,&y);
    		G[x].push_back(y);
    		G[y].push_back(x);
    	}
    	dfs(1,0);
    	calc(1,1,0,0);int w=(n-p.size())/2;
    	printf("%d %d
    ",p.size(),w);
    	for(int i=0;i<p.size();i++)
    		printf("%d ",p[i]);
    	mark[0]=0;
    	putchar('
    ');
    	print(1,0,1);
    	putchar('
    ');
    	print(1,0,2);
    	return 0;
    }
    
  • 相关阅读:
    工作流学习——Activiti流程变量五步曲
    Rational Performance Tester(RPTv8.6) 在launch Schedule 时一直卡在 29%
    19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、
    【设计模式】责任链模式
    redis源代码分析(5)——aof
    Servlet基础梳理(四)
    SQL-W3School-高级:SQL 数据类型
    SQL-W3School-高级:SQL NULL 函数
    SQL-W3School-高级:SQL NULL 值
    SQL-W3School-高级:SQL Date 函数
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15181114.html
Copyright © 2011-2022 走看看