(2021牛客多校三)J-Counting Triangles(思维)

该博客主要介绍了一道算法题,题目要求在给定的完全图中找出由三条权值相同的边组成的三角形数量。通过反向思考,计算出所有三角形的总数,然后减去不满足条件的三角形个数(即边权不完全相同的三角形)。博主提供了C++代码实现,并展示了如何避免重复计数以得到正确答案。
摘要由CSDN通过智能技术生成

样例输入: 

10 114514

样例输出:

35

题意:给定一个n个点的完全图,每条边的权值可能为0,也可能为1,让我们找出由三条权值相同的边组成的三角形的个数,每条边的边权是通过随机数给的。

这道题是通过反向思考来解决的,有n个点,由于是一个完全图,所以任意三个点都能够组成一个三角形,那么所有三角形的总个数就是C(n,3)=n*(n-1)*(n-2)/6

现在我们只要找出来边权不完全相同的三角形的个数即可,我们拿一个权值分别为0,0,1的三角形来举例:

我们先来枚举以A的两条边组成的三角形中权值不完全相同的三角形的个数,那么我们可以任意选一条以A作为起始点的权值为0的边以及选一条以A作为起始点的权值为1的边,那么如果这两条边都参与组成三角形的话一定不能组成一个三个权值完全相同的三角形,那么我们只需要记录从A出发权值为0的边数cnt,由于是一个完全图,那么从A出发的边一共有n-1条,那么从A出发权值为1的边一共有n-1-cnt个,所以这样的三角形一共有cnt*(n-cnt-1)个三角形,但是对于这个三角形而言,当我们遍历C点时也会记录一次,但是遍历B时就不会被记录,因为这个三角形中由B出发的两条边权都是0,所以对于每个不满足题意的三角形我们都会重复记录一次,所以不满足题意的三角形的总个数我们最后需要除以2,再用图中总的三角形个数-不满足题意的三角形的个数即可得到答案。

下面是代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int N=8e3+10;
namespace GenHelper
{
    unsigned z1,z2,z3,z4,b,u;
    unsigned get()
    {
        b=((z1<<6)^z1)>>13;
        z1=((z1&4294967294U)<<18)^b;
        b=((z2<<2)^z2)>>27;
        z2=((z2&4294967288U)<<2)^b;
        b=((z3<<13)^z3)>>21;
        z3=((z3&4294967280U)<<7)^b;
        b=((z4<<3)^z4)>>12;
        z4=((z4&4294967168U)<<13)^b;
        return (z1^z2^z3^z4);
    }
    bool read() {
      while (!u) u = get();
      bool res = u & 1;
      u >>= 1; return res;
    }
    void srand(int x)
    {
        z1=x;
        z2=(~x)^0x233333333U;
        z3=x^0x1234598766U;
        z4=(~x)+51;
      	u = 0;
    }
}
using namespace GenHelper;
bool edge[8005][8005];
vector<int>p[N];
int main() {
  	int n, seed;
  	cin >> n >> seed;
  	srand(seed);
  	long long sum=0;
  	for (int i = 0; i < n; i++)
    	for (int j = i + 1; j < n; j++)
        	edge[j][i] = edge[i][j] = read();
	for(int i=0;i<n;i++)
	{
		long long cnt=0;
		for(int j=0;j<n;j++)
			if(edge[i][j]) cnt++;
		sum+=cnt*(n-1-cnt);
	}
	long long ans=(long long)n*(n-1)/2*(n-2)/3;
    cout<<ans-sum/2;
 	return 0;
}
//10 114514

内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名考研真题精选所知名高的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值