题解:P11811 [PA 2015] 人赢 / Mistrzostwa

news/2025/12/5 22:11:26/文章来源:https://www.cnblogs.com/yongshao/p/19313741

废话

蒟蒻的第一篇题解!

正文

(内含一组 hack,如果你只 WA 第 18 个点)。

楼上的各位大佬,讲题思路已经很详细了。

因此这篇题解主要的目的是讲几个易错点。

那就看看我的“死亡回放”吧。

错误一

30pts。

死亡原因:没读题。

我没看见有两个问号……所以只输出了集合大小。

因此我花费了一次宝贵的测试点下载机会。

下载了个样例。

那三十分纯粹就是“不可以,总司令!”。

然后就能得 30pts。

(希望这个神金的死因能让你笑一下)。

修改后代码:(非 AC!!)。

//https://www.luogu.com.cn/problem/P11811
//P11811 [PA 2015] 人赢 / Mistrzostwa
#include<iostream>
#include<queue>
#define maxn 200010
#define maxm 400010
using namespace std;
int out[maxn],vis[maxn];
struct EDGE
{int to,next;
}edge[maxm];
int tot=0,head[maxn];
void add(int u,int v)
{edge[++tot].to=v;edge[tot].next=head[u];head[u]=tot;
}
queue <int> q;
int main()
{int n,m,d;cin>>n>>m>>d;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b);add(b,a);out[a]++;out[b]++;}int ans=n;for(int i=1;i<=n;i++)if(out[i]<d){q.push(i);vis[i]=1;}while(!q.empty()){ans--;int p=q.front();q.pop();for(int i=head[p];i;i=edge[i].next){int v=edge[i].to;if(vis[v]==1)continue;out[v]--;if(out[v]<d){q.push(v);vis[v]=1;}}}if(ans==0)cout<<"NIE";else{cout<<ans<<"\n";for(int i=1;i<=n;i++)if(vis[i]==0)cout<<i<<" ";}return 0;
}
/*
4 4 2
1 2
2 3
3 4
4 23
2 3 4
*/

错误二

相信大犇们都能看出来我这个代码有大大滴问题。

所以只能得 76pts。

一个很明显的死因就是:

这张图并不一定联通。

所以我不能直接在 n 的基础上进行加减。

然后,我才想到本题的主角:并查集。

于是我就在建图的时候先连并查集。

后来对每一个集合进行类似处理。

之后得到的代码就是这个(非 AC!!!!)。

//https://www.luogu.com.cn/problem/P11811
//P11811 [PA 2015] 人赢 / Mistrzostwa
#include<iostream>
#include<queue>
#define maxn 200010
#define maxm 400010
using namespace std;
int out[maxn],vis[maxn],fa[maxn],num[maxn];
struct EDGE
{int to,next;
}edge[maxm];
int tot=0,head[maxn];
void add(int u,int v)
{edge[++tot].to=v;edge[tot].next=head[u];head[u]=tot;
}
int find(int x){return (fa[x]==x?x:fa[x]=find(fa[x]));}
void marge(int x,int y)
{x=find(x);y=find(y);if(x==y)return;fa[y]=x;
}
queue <int> q;
int main()
{int n,m,d;cin>>n>>m>>d;for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;marge(a,b);add(a,b);add(b,a);out[a]++;out[b]++;}for(int i=1;i<=n;i++){num[find(i)]++;}for(int i=1;i<=n;i++)if(out[i]<d){q.push(i);vis[i]=1;}while(!q.empty()){int p=q.front();num[find(p)]--;q.pop();for(int i=head[p];i;i=edge[i].next){int v=edge[i].to;if(vis[v]==1)continue;out[v]--;if(out[v]<d){q.push(v);vis[v]=1;}}}int ans=0,maxnum=0;for(int i=1;i<=n;i++){if(num[i]>ans)ans=num[i],maxnum=i;}if(ans==0)return cout<<"NIE",0;cout<<ans<<"\n";for(int i=1;i<=n;i++)if(find(i)==maxnum&&vis[i]==0)cout<<i<<" ";return 0;
}
/*
4 2 1
4 1
2 32
1 4
*/

这其实是一个非常优的骗分解。

简直是我见过写过的最优的骗分解。

因为它可以骗到 97pts 的高分!!

错误三

可是您是要 AKIOI 的人!

不允许有一分的丢失!

大犇们看我代码也看出来了。

我这个代码有个非常严重的问题。

就是导出子图不一定联通。

hack

举个例子:

比如这张图 d = 3。

那么扫描一遍就会把中间的那个店删掉。

之后在扫描,就会发现所有点都“合法”。

于是程序就会把剩下并不联通的八个点一起输出了。

那通过这个,我们就能看出:

在删边前就维护集合是行不通的。

因为断边之后,集合的连通性会发生改变,而你却不自知。

又因为断边维护集合是困难的。

因此正确答案昭然若揭:

先断边,再跑并查集。

(不是这么简单的道理我咋没想到呢)

正解

正解我就不讲了。

楼上各位大犇讲得都很详细。

那我就直接扔代码了。

(AC)

Talk is cheap, show me the code.

//https://www.luogu.com.cn/problem/P11811
//P11811 [PA 2015] ÈËÓ® / Mistrzostwa
#include<iostream>
#include<queue>
#define maxn 200010
#define maxm 400010
using namespace std;
int out[maxn],vis[maxn],fa[maxn],num[maxn];
struct EDGE
{int to,next;
}edge[maxm];
int tot=0,head[maxn];
void add(int u,int v)
{edge[++tot].to=v;edge[tot].next=head[u];head[u]=tot;
}
int find(int x){return (fa[x]==x?x:fa[x]=find(fa[x]));}
void marge(int x,int y)
{x=find(x);y=find(y);if(x==y)return;fa[y]=x;
}
queue <int> q;
int main()
{int n,m,d;cin>>n>>m>>d;for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b);add(b,a);out[a]++;out[b]++;}for(int i=1;i<=n;i++)if(out[i]<d){q.push(i);vis[i]=1;}while(!q.empty()){int p=q.front();q.pop();for(int i=head[p];i;i=edge[i].next){int v=edge[i].to;if(vis[v]==1)continue;out[v]--;if(out[v]<d){q.push(v);vis[v]=1;}}}for(int i=1;i<=n;i++){if(vis[i]==1)continue;for(int j=head[i];j;j=edge[j].next){int t=edge[j].to;if(vis[t]==1)continue;marge(i,t);}}for(int i=1;i<=n;i++)if(vis[i]==0)num[find(i)]++;int ans=0,maxnum=0;for(int i=1;i<=n;i++){if(num[i]>ans)ans=num[i],maxnum=i;}if(ans==0)return cout<<"NIE",0;cout<<ans<<"\n";for(int i=1;i<=n;i++)if(find(i)==maxnum&&vis[i]==0)cout<<i<<" ";return 0;
}
/*
4 2 1
4 1
2 32
1 4
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/989230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:GraphQL:让前端自己决定要什么数据

详细介绍:GraphQL:让前端自己决定要什么数据pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

2025.12.5

没课早起但是躺一天,洗澡,录入团课记录

实用指南:Configuration of TCP/IP with SSL and TLS for Database Connections

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232420 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 1)编写一个含有表单的HTML 2)编写JavaScript并尝试注入攻击 3)正常安装、启动MySQL,建库、创建用户、修改密码、建表 4)编写PHP网页,连接数据库,进行用户认证 5)最简单的SQL注入,XSS攻击测试 6)安装DVW…

BZOJ1278 向量 vector

给定 \(n\) 个向量 \((x_i,y_i)\)。选出若干个向量,最大化向量和的模长,输出其平方。 \(1 \leq n \leq 10^5\)。考虑弱化条件。我们不妨找到一条直线 \(l\),最大化向量和在 \(l\) 上投影的长度。容易证明,一定能找…

14.jdbc第三步PreparedStatement防sql注入

1.首先要明白什么是sql注入、怎么做①sql注入理解: 通过将不可信输入伪装成 SQL 语法片段,篡改原始 SQL 的语法结构,迫使数据库执行非预期的非法操作。② 怎样做通过 URL 参数传参或者其他传参方式将含有sql语法的参…

详细介绍:【STL源码剖析】从源码看 heap:元素的 “下沉” 与 “上浮”

详细介绍:【STL源码剖析】从源码看 heap:元素的 “下沉” 与 “上浮”2025-12-05 21:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

大信息环境搭建从零开始(十四)CentOS 7 系统更新源更换详解:阿里云镜像源配置完整指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年度安全狗狗驱虫药品牌排行榜:专业评测助力科学养宠

摘要: 春冬季是宠物寄生虫高发期,选择安全有效的驱虫药成为养宠家庭首要关切。本文基于产品成分、临床数据、用户反馈及第三方权威检测,梳理出十大安全可靠的狗狗驱虫品牌,重点解析其核心优势与使用规范,为宠物主…

实用指南:Vue编程式路由导航

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu 22.04 与 24.04 常用操作命令

Ubuntu 22.04 与 24.04 常用操作命令 适用场景:系统管理员、开发人员针对 Ubuntu 22.04 LTS(Jammy Jellyfish)与 24.04 LTS(Noble Numbat)的日常运维 特别说明:Ubuntu 无 24.02 版本,推测为笔误,以下基于官方 …

【Java】String

目录前言内容概览更新记录String的创建1.直接创建2.String方法String常用API注意点String本身的特点1.String的对象是不可变字符串对象2.双引号创建的字符串对象存储在常量池中,且内容相同只能存储一份3.new String创…

拒绝智商税!2025最新学习机榜单发布,十大热门机型横向对比,一看就懂

随着教育智能硬件迈入“深水区”,2025年末的学习机市场已从单纯的硬件参数竞赛,转向教育资源厚度与AI技术有效性的综合较量。面对品牌宣传中各类“顶级”标签,消费者更需要一份基于真实产品力、剥离营销话术的理性参…

2025年12月留学生求职陪跑服务推荐榜:哪家更贴合专业背景定制

2025年,海归求职人数预计突破80万,叠加AI面试普及率超60%、企业缩编增效等新变量,留学生仅靠"海投+套模板"的生存空间被极度压缩。在此背景下,求职陪跑服务正从"可选项"变为"必选项"…

2025年留学生求职机构排名推荐指南 途鸽求职榜首领跑赛道

序言 对于留学生来说,求职从来不是“投简历→面试→拿offer”的简单流程——专业背景与岗位不匹配的迷茫、海投200份简历零面试的挫败、面试时不懂国内职场语境的紧张、拿到多份offer不知如何选择的纠结,甚至试用期怕…

网络安全的守护与利器:r/netsec 月度技术讨论与工具分享

本文聚焦于r/netsec子论坛的月度技术交流,不仅明确了技术讨论规范,更分享了honeyd工具的现代化更新版本,该工具用于在单一系统上模拟大量主机以迷惑网络扫描器。r/netsec 月度讨论与工具帖 欢迎在此提出与网络安全(…

2025留学生求职机构哪家强?5万offer全周期不限次服务+在职导师

对于2025届留学生而言,归国求职正面临前所未有的挑战:国内就业市场急剧变化带来的信息壁垒、跨专业求职的适配困境、以及职场本土化表达的能力短板。在这样的背景下,专业求职服务机构的价值愈发凸显。然而,市场鱼龙…

重组蛋白表达纯化技术流程解析:从基因到蛋白的精准制备

重组蛋白技术是现代生命科学研究的核心工具之一,广泛应用于结构生物学、药物筛选、信号通路研究及酶动力学分析等领域。作为生物科技企业,我们专注于为科研工作者提供高质量的重组蛋白定制服务。本文将从技术流程的角…

拒绝“中间商赚差价”!2025南京静音舱源头工厂综合实力排名发布:声博士Soundbox断层领先

拒绝“中间商赚差价”!2025南京静音舱源头工厂综合实力排名发布:声博士Soundbox断层领先 2025年11月,长三角健康办公研究院联合《商业空间设计》发布的《2025长三角办公空间声环境与健康白皮书》指出,随着混合办公…

软件测试的分类1(含黑盒测试、白盒测试、Alpha测试、Beta测试、灰盒测试)

【软件测试的分类】 1、软件测试的核心分类维度 软件测试可按「测试对象、测试方法、测试阶段、测试环境、测试目的」等维度分类,核心常用分类如下:分类维度 核心测试类型 记忆关键词测试方法(是否看代码) 黑盒测试…