题目
{% fold 点击显/隐题目 %}
Then there are n-1 rows. The th row should contain n-i numbers, in which number represents the relationship between member i and member j+i. 0 means these two individuals are not friends. 1 means these two individuals are friends.
题解
判断一个无向图中是否存在3个点没有直接联通,或者3个点直接互联通
可以转换为是否有点有三个及三个以上的边,或者有三个以上的点与他没有边
可以发现5个点按照正五边形连接是极端情况了,再多一个点,无论怎么连都无法满足要求
因此,当 n>=6
时必定是 Bad Team!
对于 n<6
的情况暴力求解即可
需要注意的是,数组开到 7*7
即可,开 1e5*1e5
会爆内存
另外如果 n>=6
,读入仍然需要一个一个读,不能一次读一行(最后一行没有 \n
)
代码
{% fold 点击显/隐代码 %}```cpp Friend-Graph https://github.com/OhYee/sourcecode/tree/master/ACM 代码备份
#include
using namespace std;
const int maxn = 10;
int n;
int r[maxn][maxn];
bool judge() {
for (int i = 1; i <= n; ++i) {
int friends = 0, notfriends = 0;
for (int j = 1; j <= n; ++j) {
if (i != j) {
if (r[i][j] == 1)
++friends;
else
++notfriends;
}
}
if (friends >= 3 || notfriends >= 3)
return false;
}
return true;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
bool ok;
if (n >= 6) {
for (int i = 1; i < n; i++)
scanf("%*[^\n]");
ok = false;
} else {
for (int i = 1; i < n; i++)
for (int j = 1; j <= n - i; ++j) {
scanf("%d", &r[i][i + j]);
r[i + j][i] = r[i][i + j];
}
ok = judge();
}
printf("%s\n", ok ? "Great Team!" : "Bad Team!");
}
return 0;
}
{% endfold %}