牛妹的游戏

链接:

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

UPD:数据保证不会有两条控制链控制的据点完全相同,也保证不会有某条控制链两端控制的据点相同。

牛妹最近沉迷于一个名为 ingress 的游戏中…

游戏中,蓝绿营两个对立阵营互相角力,通过争夺据点来控制区域。 具体来说,二维的平面上分布有若干据点,玩家可以通过XM扫描器来控制这些据点。
同一阵营控制的两个据点可以相连成为一条被该阵营控制的链。 而同一阵营控制的三条链,首尾相接可以形成一块被该阵营控制的区域。
如下图为一块被蓝方控制的区域:

在这里插入图片描述

但是这样的游戏没有一个胜利或失败结局,牛牛觉得很不舒服,于是他开发出了 imgress。 这个游戏和 ingress
的区别在于,如果一个阵营控制了一块区域,则形成这块区域的据点无法再被另一阵营控制。 此外,imgress
的玩家并非直接对据点进行控制,而是通过在据点间形成控制链来间接控制对应据点,于是可能出现同一个据点被两方的控制链所使用的情况。

现在,牛妹加入了蓝方阵营,她已经得知了场上的总据点数,和蓝方已经形成的所有控制链。
现在她想知道目前场上是否可能已经存在被玩家控制的区域,你需要帮她解决这个问题。

输入描述:

第一行一个正整数 T,表示数据组数。 每组数据的第一行有两个正整数 n 和 m,表示场上总据点数为 n,此时蓝方已经形成了 m 条控制链。
接下来 m 行,每行有两个正整数 x 和 y,表示这条控制链由据点 x 和据点 y 形成。

输出描述:

对于每组数据,如果目前场上有可能存在被玩家控制的区域,则输出一行 “yes”,否则输出一行 “no”。(均不包含引号)

示例1
输入

2
3 3
1 2
2 3
3 1
5 5
1 2
2 3
3 4
4 5
5 1

输出

yes
no

说明

对于第一组数据,蓝方在所有据点间形成了控制链,此时的情况如下图所示:
在这里插入图片描述

可以发现蓝方已经形成了控制区域。

对于第二组数据,蓝方的 5 条控制链首尾相接,如下图所示:

在这里插入图片描述

此时蓝方没有形成控制区域,同时,可以发现绿方即使控制了所有蓝方没有控制的链,也无法形成控制区域。

题意:

我来把题目浓缩下:就是给你一个无向图,问这个图和它的补图是否存在三元环?
如果图本身有三元环就是蓝方赢,如补图有三元环,就是绿方赢,但题目是问你蓝绿方有一方能赢就输出yes,都不能就输出no

题解:

有一个结论:如果点>=6的话,它以及它的补图一定存在三元环。
网上说这个叫拉姆塞结论(我们离散也没讲过
点数小于6的话,暴力就OK了,先标记给的边,三层for循环,看看任意三个边能不能构成环。

代码:

#include<bits/stdc++.h>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int mod = 1e9 + 7;
const int maxn=102;
int n,sum;
int f[102][102];
void biaoji(int x,int y)
{
	f[x][y]=1;
	f[y][x]=1;
}
int main()
{
	int T,n,m,a,b;
	cin>>T;
	while(T--)
	{
		sum=0;
		mem(f);
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			cin>>a>>b;
			biaoji(a,b);
		}
		if(n>=6)
		{
		cout<<"yes";	
		}
		else
		{
			for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
			for(int k=j+1;k<=n;k++)
			{
				int w=f[i][j]+f[j][k]+f[k][i];
				if(w==0||w==3)sum++;
				if(sum)break;
			}
		if(sum)cout<<"yes"<<endl;
		else cout<<"no"<<endl;
		}

	} 
}
posted @ 2020-04-28 23:16  回归梦想  阅读(98)  评论(0编辑  收藏  举报