多校训练3 J Counting Triangles (同色三角形)

本文介绍了如何解决一个关于无向完全图的问题,其中边被涂成黑色或白色。目标是计算同色三角形的数量,即所有三角形减去异色三角形。通过三角形总个数减去异色三角形个数来求解,其中异色三角形个数取决于每个顶点连接的黑边和白边数量。文章提供了思路和计算方法,并提醒注意数据类型可能导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一个有n个顶点的无向完全图,图形的每一条边都涂成黑色或白色,求同色三角形个数。题目提供的代码中的边数组存储图形中边的颜色。边[i][j]=1表示从i到j的边为黑色,否则为白色。确保有一种不依赖于数据生成方式的方法。

思路:求同色三角形的个数,可以通过用 三角形总个数 - 异色三角形个数 得到。
三角形总个数 = n *(n - 1) * (n - 2) / 6;
异色三角形个数:判断一个顶点是否连出去异色的边,如果一个顶点连出异色的边,那么对于该点异色三角形个数就是黑边数 * 白边数 / 2;(/ 2是因为同一个三角形被计算了两次)
连出异色的边判断:完全图意味着每个顶点连出去 n - 1 条边,我们用 cnt 表示黑边的数量,计算cnt,当 cnt = n - 1时,表示连出去的都是黑边,此时 n - 1 - cnt = 0, 用 sum 来累加每个顶点产生的异色三角形个数,sum += cnt * (n - 1 - cnt); 最后记得 sum /= 2;

  • 同时注意一下类型转换导致的数据错误问题。
  • 其实可以用朴素的三重循环先搞几个数据出来,检验自己写的代码是否正确,我当时不清醒没找出错误。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 8010;
typedef long long ll;

namespace GenHelper
{
   
    unsigned z1,z2,z3,z4,b,u;
    unsigned get()
    {
   
        b=((z1<<6)^z1)>>13;
        z1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值