NWERC2020J-Joint Excavation【构造,贪心】

1|0正题

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


1|1题目大意

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

1n,m2×105


1|2解题思路

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

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

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

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

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


1|3code

#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\n",p.size(),w); for(int i=0;i<p.size();i++) printf("%d ",p[i]); mark[0]=0; putchar('\n'); print(1,0,1); putchar('\n'); print(1,0,2); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15181114.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(120)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示