J-统计个数

牛客小白月赛暴力题
(感觉很多题目都能用暴力直接开,但是我这道题貌似逻辑炸了?)

题干

题目描述
给出一张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;
}

暴力能过,不过这样太蠢了····改天看看用判断成环的板子试试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值