牛客小白月赛暴力题
(感觉很多题目都能用暴力直接开,但是我这道题貌似逻辑炸了?)
题干
题目描述
给出一张N个点M条边的图,假设图中有三个节点分别为a,b,c,若点a和点b之间有边并且b和c之间有边的话,我们就称(a,b,c)为一条线,同时视(c,b,a)和(a,b,c)为同一条线,而对于其他的组合则认为是和(a,b,c)不同的线。
如果(a,b,c)是一条线并且点a和点c之间也有边的话,我们称(a,b,c)构成一个三角,同理我们视由这三个点组成的三角为同一个三角,即(a, b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)、(c, b, a)只能被算一次
请分别统计给定的图中,三角和线的数量
输入
3
5
7
1 2
2 3
1 3
3 4
2 4
4 5
1 5
3
3
1 2
3 1
3 2
4
3
1 2
2 3
3 4
输出
6/13
1/1
0/1
有个坑注意一下,就是q要乘3·····然后再gcd
AC代码
#include<stdio.h>
#include<string.h>
int gcd(int x, int y) {
return y ? gcd(y, x % y) : x; }
bool vis1[205][205][205], mp[205][205], vis2[205][205][205];
int main()
{
int t, n, m, a, b, ans1, ans2;
scanf("%d", &t);
while (t--)
{
memset(mp, 0, sizeof mp);
memset(vis1, 0, sizeof vis1);
memset(vis2, 0, sizeof vis2);
ans1 = ans2 = 0;
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d%d", &a, &b);
mp[a][b] = mp[b][a] = 1;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
for (int k = 1; k <= n; ++k)
{
if (i != j && j != k && i != k)
{
if (!vis1[i][j][k] && mp[i][j] && mp[j][k])
{
++ans1;
vis1[i][j][k] = vis1[k][j][i] = 1;
}
if (!vis2[i][j][k] && vis1[i][j][k] && mp[i][k])
{
++ans2;
vis2[i][j][k] = vis2[i][k][j] = vis2[j][i][k] = vis2[j][k][i] = vis2[k][i][j] = vis2[k][j][i] = 1;
}
}
}
ans2 *= 3;
int d = gcd(ans1, ans2);
ans1 /= d, ans2 /= d;
printf("%d/%d\n", ans2, ans1);
}
return 0;
}
暴力能过,不过这样太蠢了····改天看看用判断成环的板子试试