牛客4 Just a joke

42 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

传送门

思路:

对于“线”来说,去掉一条边一定会留下一个点,这会使得轮次回到原来的状态,所以可以直接删除“线”,同理,环需要删除两次,点一次。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<set>
using namespace std;
#define ll long long
int f[1000];
int a[110][110];
int find(int x)
{
	return f[x] == x ? x : f[x]=find(f[x]);
}
int vis[110];

int main()
{
	int n,m;
	cin>>n>>m;
	int cnt = 0;
	for(int i = 1; i <= n; i++)f[i] = i;
	while(m--)
	{
		int u,v;
		cin>>u>>v;
		if(find(u) != find(v))
		f[find(u)] = find(v);
		else
		cnt++;
		a[u][v] = a[v][u] = 1;
	}
	int sin = 0,al = 0;
	for(int i = 1; i <= n; i++)
	{
		if(f[i] == i && !vis[find(i)])
		{
			sin++;
			continue;
		}
		if(!vis[find(i)])
		{
			al++;
			vis[find(i)] = 1;
		}
	}
	al -= cnt;
	if((cnt*2+al+sin) % 2) cout<<"Alice"<<endl;
	else cout<<"Bob"<<endl;
}