题目
题目描述
作为开启黎明的白笛,黎明卿波多尔多具有令人胆寒的实力。
黎明卿的一项重要能力是精神隶属机 (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 5≤n≤50,n−1≤m≤2n−1
题解
题目大意
构造一张 n n n个点, m m m条边的图,使得最小顶点割最大,输出最小顶点割和 m m m条边
题目分析
容易想到答案只有1、2、3,于是我们对其分别讨论
- m = n − 1 m=n-1 m=n−1,答案是1,构造方法是一条链
- n ≤ m < n + ⌈ n 2 ⌉ n\leq m<n+\lceil\dfrac{n}{2}\rceil n≤m<n+⌈2n⌉,答案是2,先构造一个环,然后连环的直径
- m ≥ n + ⌈ n 2 ⌉ m\ge n+\lceil\dfrac{n}{2}\rceil m≥n+⌈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;
}