这道题涉及到了连通图的相关的简单定义,只要搞清楚相关定义和这个游戏规则就行了。赢输的关键在于搞清楚不连通时的临界状态,那就是不连通的前一个状态就是形成了一个单只的图(每两个顶点只有一条边相连),这时不管去哪一条边后这个图都不连通了。
完整代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
char a[100010];
int k;
scanf("%d",&k);
getchar();
for(int i=0;i<k;i++)
{
scanf("%c",&a[i]);
}
scanf("%d%d",&n,&m);
int z,x;
for(int i=0;i<m;i++)
{
scanf("%d%d",&z,&x);
}
//这里只需要找到从初始边数形成单只的图需要减几条边(也就是操作几次),则下一个人必输
int num=(m-(n-1))%k;//有所有人轮完一遍还连通的情况,这时要再从第一个人开始继续操作,所以要对人数取余
if(a[num]=='1')
{
printf("2\n");
}
else{
printf("1\n");
}
}
}