题意:给定一个n个结点m条边的图,Alice和Bob轮流可以进行下面两种操作:
1.删除一条边
2.删除一个无环连通分量
Alice先操作,谁最后不能操作谁输。
分析:首先我们不能确定一开始给定的图是否是一个连通图,不管怎样,我们先拿其中的一个连通图来进行分析,对于这个连通图我们可以对其进行第一种操作,操作后有两种可能,第一种是只是少了一条边,这种情况对应的是删除的边在一个环内,还有一种可能是变为两个连通分量,但是无论怎样,在该图变为无环连通分量之前是不能进行第二种操作的。对于一个有ni个点,mi条边的连通分量,我们必须先对他进行mi-(ni-1)次删边操作才能将其变为一个无环连通分量,而这是两个人都必须要完成的,当该图变为一个无环连通分量时,我们下一步操作可能是操作1,结果就是连通分量个数+1,也可能是操作2,那么结果就是连通分量个数-1,无论怎样,连通分量的奇偶性一定会发生改变,也就是说对这个连通分量的操作次数一定是mi-(ni-1)+1+2*j=mi-ni+2+2*j,对于其他的连通分量分析也是这样,那么总的操作次数就是+2*x=m-n+2*x,所以答案只与m-n的奇偶性有关,如果m-n为奇数就是先手赢,否则后手赢
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if((m-n)&1) puts("Alice");
else puts("Bob");
return 0;
}
下面来说一种更为简单的方法,对于操作1,我们会让整张图的边数-1,而对于操作2,假如我们是对一个具有ni个点的连通分量进行操作的,那么结果就是整张图的点数-ni,边数-(ni-1),总的点数和边数就是减少了(2*ni-1),变化量也是个奇数,所以我们只需要知道一开始点数和边数的和是一个奇数还是偶数即可知道谁会赢。当n+m是奇数时,先手赢,否则后手赢
因为m+n和m-n的奇偶性是相同的,刚好和前一种做法相对应
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if((m+n)&1) puts("Alice");
else puts("Bob");
return 0;
}