首页 > 编程语言 >[题解][2022江西省程序设计竞赛] Graphic Game

[题解][2022江西省程序设计竞赛] Graphic Game

时间:2024-04-12 16:00:41浏览次数:30  
标签:度数 Cirno Graphic int 题解 Game erase 顶点 du

题目描述

Cirno被推荐了一个游戏,她决定今天和大妖精一起玩。最初,有一个包含2 × n个顶点和m条边的图。在每一轮中,Cirno和大妖精都必须选择一个不同的顶点。所选顶点的度数必须相同。然后,Cirno和大妖精将从图中移除它们。
现在Cirno想知道是否有办法从给定的图中移除所有顶点。如果存在,请给出一个例子。

题解

该题有2 * n个顶点,一定能删完。
为什么一定能删完?可以通过反证法:设不能删完,剩余2 * x个点,且每个点的度数各不相同。
由于最大度数不可能超过2 * x - 1,那么2 * x个点的度数就是0,1,2,...,2 * x - 1。
观察到有一个点的度数为2 * x - 1 ,则剩余所有点都与这个点有边;但有一个点度数为0,则剩余所有点都与这个点无边。
二者自相矛盾。此种情况不存在。所以一定有解,且解与删除顺序无关。
考虑一个时间复杂度较优的解法:可以通过set维护度数,每次删除度数最大的两个点。时间复杂度稳定在O(nlogn)。

代码

点击查看代码
	#include<bits/stdc++.h>
	using namespace std;
	const int N=2e6+7;
	int n,m,en=0,h[N],du[N];
	struct Edge{
		int v,nxt;
	}e[N<<1];
	set<int>s[N<<1];
	void adde(int u,int v){
		e[++en].v=v,e[en].nxt=h[u],h[u]=en;
	}
	int main(){
		ios::sync_with_stdio(0);
		cin.tie(0);
		cout.tie(0);
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			adde(u,v),adde(v,u);
			du[u]++,du[v]++;
		}
		for(int i=1;i<=n*2;i++)s[du[i]].insert(i);
		int t=m;
		while(t>=0){
			if(s[t].size()>=2){
				int x=*s[t].begin();
				s[t].erase(x);
				int y=*s[t].begin();
				s[t].erase(y);
				cout<<x<<" "<<y<<"\n";
				du[x]=du[y]=0;
				for(int i=h[x];i;i=e[i].nxt){
					int v=e[i].v;
					if(du[v]>0){
						s[du[v]].erase(v);
						du[v]--;
						s[du[v]].insert(v);
					}
				}
				for(int i=h[y];i;i=e[i].nxt){
					int v=e[i].v;
					if(du[v]>0){
						s[du[v]].erase(v);
						du[v]--;
						s[du[v]].insert(v);
					}
				}
			}
			else t--;
		}
		return 0;
	} 

标签:度数,Cirno,Graphic,int,题解,Game,erase,顶点,du
From: https://www.cnblogs.com/zwzww/p/18131514

相关文章

  • C. Array Game
    原题链接题解1.突然遇到新颖的题,我们可以采用逐步变难法、最简策略法、观察数据法逐步变难法:当\(k=0\)时,\(ans_0=min(a[i])\)\(k=1\)时\(ans_1=min(ans_0,a[i]-a[i+1](sort))\)观察数据法:\(k=2\)时观察数据可知\(n^2\)左右的算法是可行的,所以我们可以先两端循环遍......
  • windows MySQL报错Packet for query is too large问题解决
    1、报错Cause:com.mysql.cj.jdbc.exceptions.PacketTooBigException:Packetforqueryistoolarge(11,792,709>4,194,304).Youcanchangethisvalueontheserverbysettingthe'max_allowed_packet'variable.出现问题的原因:批量插入数据量过大MySQL根据配置......
  • 52 Things: Number 14: What is a cryptographic pairing?
    52Things:Number14:Whatisacryptographicpairing?52件事:第14条:什么是密码配对? Thisisthelatestinaseriesofblogpoststoaddressthelistof '52ThingsEveryPhDStudentShouldKnow'todoCryptography:asetofquestionscompiledtogivePhD......
  • Cunning Gena 题解
    \(\texttt{ProblemLink}\)简要题意翻译很清楚。思路记\(x_i\)表示第\(i\)个人的花费,\(s_i\)表示第\(i\)个人做题集合,\(k_i\)表示第\(i\)个人需要的显示器。\(m\le20\)且不是计数,考虑dp,发现确实可以做。可以设\(f_i\)表示做题集合为\(i\)时最小花费。易......
  • [题解][2022江西省程序设计大赛] A Game of Taking Numbers
    题目描述rqdmap和他的小女友正在玩一个游戏。有n个正整数。这两个人轮流取数字。为了显示他的绅士风度,rqdmap要求他的小女友先取数字。每当rqdmap的小女友可以选择剩下的数字中的任意一个来拿走(记为x),rqdmap需要从剩下的数字中选择一个数字(记为y),并且满足以下两个条件中的至少一个......
  • 文件下载时中文文件名乱码及链接失效问题解决
    问题:报错提示11-Apr-202415:38:43.792信息[Catalina-utility-2]org.apache.catalina.startup.HostConfig.deployDirectoryWeb应用程序目录[G:\开发工作用软件\Java开发用\apache-tomcat-10.1.7\webapps\manager]的部署已在[293]毫秒内完成11-Apr-202415:38:44.573信息......
  • 题解 P10314【[SHUPC 2024] 函数】
    注意到:\[f(x)=\lfloorx\rfloor,\qquad(x\notin\N)\]代码:intT;doublex;cout<<fixed<<setprecision(12);for(cin>>T;T;--T){cin>>x;cout<<floor(x)<<endl;}感觉说明不够过不了审,于是简单说一下正确性:由诱导公式\(\c......
  • [题解] [洛谷P1404] 平均数
    洛谷P1404平均数题目描述给一个长度为\(n\)的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度\(\geqm\)。输入格式第一行两个整数\(n\)和\(m\)。接下来\(n\)行,每行一个整数\(a_i\),表示序列第\(i\)个数字。输出格式一个整数,表示最大平均数......
  • [题解] <NOIP2017> 时间复杂度
    [题解]NOIP2017时间复杂度题目描述小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正......
  • CF617E XOR and Favorite Number 题解
    想了好久才明白zz来源?:莫队题单题目大意给定一个长度为\(n\)的序列\(a\),然后再给一个数字\(k\),再给出\(m\)组询问,每组询问给出一个区间,求这个区间里面有多少个子区间的异或值为\(k\)。\(1\len,m\le10^5\)\(0\lek,a_i\le10^6\)\(1\lel_i,r_i\len\)题......