题目链接:Friend-Graph
题目大意:给你n个点,然后给出n个点之间的关系,1为认识,0为不认识,试问在这个图中是否存在三个或以上的点都互相认识的情况或者三个或以上的点都互相不认识的情况
题目思路:三个以上的情况存在则三个情况一定存在,所以只需要判断三个的情况,然后我们可以判断有三个存在的情况,判断三个都不存在的情况我们只需要将图翻转一下就好了,然后套用拉姆齐定理,然后三重暴力冲上去邻接矩阵判断,人有多大胆,地有多大产
#include <map>
#include <set>
#include <cmath>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 3e3+10;
int t,n,a[maxn][maxn];
template <class T>
inline bool scan_d(T &ret)
{
char c;
int sgn;
if (c = getchar(), c == EOF)
{
return 0; //EOF
}
while (c != '-' && (c < '0' || c > '9'))
{
c = getchar();
}
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0');
}
ret *= sgn;
return 1;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 1;i < n;i++)
for(int j = i+1;j <= n;j++)
scanf("%d",&a[i][j]);
if(n >= 6) {puts("Bad Team!");continue;}
int flag = 0;
for(int i = 1;i <= n;i++){
if(flag == 1) break;
for(int j = i+1;j <= n;j++){
if(flag == 1) break;
if(a[i][j] == 0) continue;
for(int k = j+1;k <= n;k++){
if(a[i][k] == 1&&a[j][k] == 1) {flag = 1;puts("Bad Team!");break;}
}
}
}
if(flag == 1) continue;
for(int i = 1;i < n;i++)
for(int j = i+1;j <= n;j++)
a[i][j] = (a[i][j]+1)%2;
for(int i = 1;i <= n;i++){
if(flag == 1) break;
for(int j = i+1;j <= n;j++){
if(flag == 1) break;
if(a[i][j] == 0) continue;
for(int k = j+1;k <= n;k++){
if(a[i][k] == 1&&a[j][k] == 1) {flag = 1;puts("Bad Team!");break;}
}
}
}
if(flag == 0) puts("Great Team!");
}
return 0;
}