【2020.12.03提高组模拟】黎明卿 (bondorudo)

题目

题目描述

作为开启黎明的白笛,黎明卿波多尔多具有令人胆寒的实力。

黎明卿的一项重要能力是精神隶属机 (Zoaholic)。在第五层基地内有 n n n位祈 手,黎明卿将他们编号为1,2, … , n n n。每个祈手都是黎明卿潜在的灵魂容器:黎明卿在某一时刻附身在其中一人上,同时,黎明卿可以随时将灵魂转入与当前被附身对象不同的、满足某类条件的某位祈手的躯壳中。

起初,所有祈手之间都相斥,这意味着黎明卿无法进行灵魂转移。黎明卿将对祈手们进行 m m m次改造:每次,他会选择一对相斥的祈手,使这对祈手间的关系变为相容,亦即,在改造后,如果黎明卿附身在其中一位祈手身上,它可以随时将灵魂转移到另一名祈手上。

不幸的是,当战争来临时,一些祈手可能被入侵者破坏。聪明的入侵者们会选择消灭最少数量的祈手,使得黎明卿的阵型被破坏:在破坏结束后,无论黎明卿当前附身于哪一个未被消灭的祈手,他都无法直接或间接地将灵魂转移到所有未被消灭的祈手身上。

为了使自己的能力最大化,黎明卿希望得出一种改造方案,使得:在由这一方案改造而成的阵型下,若入侵者们想要破坏这一阵型,需要消灭的祈手的数量最大。

数据范围

5 ≤ n ≤ 50 , n − 1 ≤ m ≤ 2 n − 1 5\leq n\leq50,n-1\leq m\leq 2n-1 5n50,n1m2n1

题解

题目大意

构造一张 n n n个点, m m m条边的图,使得最小顶点割最大,输出最小顶点割和 m m m条边

题目分析

容易想到答案只有1、2、3,于是我们对其分别讨论

  1. m = n − 1 m=n-1 m=n1,答案是1,构造方法是一条链
  2. n ≤ m < n + ⌈ n 2 ⌉ n\leq m<n+\lceil\dfrac{n}{2}\rceil nm<n+2n,答案是2,先构造一个环,然后连环的直径
  3. m ≥ n + ⌈ n 2 ⌉ m\ge n+\lceil\dfrac{n}{2}\rceil mn+2n,答案是3,先构造一个环,然后连所有直径,然后随便连没连的点

Code

#include<cstdio>
using namespace std;
int n,m;
bool b[55][55];
int main()
{
	freopen("bondorudo.in","r",stdin);
	freopen("bondorudo.out","w",stdout);
	scanf("%d%d",&n,&m);
	if (m==n-1)
	{
		printf("1\n");
		for (int i=1;i<=m;++i)
			printf("%d %d\n",i,i+1);
		fclose(stdin);
		fclose(stdout);
		return 0;
	}
	if (m>=n&&m<n+((n-1)>>1)+1)
	{
		printf("2\n");
		for (int i=1;i<n;++i)
			printf("%d %d\n",i,i+1);
		printf("%d 1\n",n);
		m-=n;
		for (int i=1;i<=m;++i)
			printf("%d %d\n",i,(i+(n>>1)-1)%n+1);
		fclose(stdin);
		fclose(stdout);
		return 0;
	}
	if (m>=n+((n-1)>>1)+1)
	{
		printf("3\n");
		for (int i=1;i<n;++i)
			printf("%d %d\n",i,i+1),b[i][i+1]=true;
		printf("%d 1\n",n);
		b[n][1]=true;
		m-=n;
		for (int i=1;i<=((n-1)>>1)+1;++i)
			printf("%d %d\n",i,(i+(n>>1)-1)%n+1),b[i][(i+(n>>1)-1)%n+1]=true;
		m-=((n-1)>>1)+1;
		for (int i=1;i<=n;++i)
			b[i][i]=true;
		while (m--)
		{
			bool bj=false;
			for (int i=1;i<=n;++i)
			{
				for (int j=i+1;j<=n;++j)
					if (!b[i][j]) 
					{
						printf("%d %d\n",i,j);
						b[i][j]=bj=true;
						break;
					}
				if (bj) break;
			}
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页