题意:一个有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