AT_abc258_g 题解

发布时间 2023-07-20 10:23:21作者: ZnHF

题目链接

题意简述

给定一张无向图,若图中三个点 \(a\)\(b\)\(c\) 满足 \(a\)\(b\) 有边相连,\(a\)\(c\) 有边相连,\(b\)\(c\) 有边相连,则称点 \(a\)\(b\)\(c\) 构成了一个三角形,求在给定的图中三角形的个数。

题目分析

一个比较直接的想法是枚举 \(a\)\(b\)\(c\) 的编号,时间复杂度为 \(O(n^3)\),无法通过本题。

我们可以只枚举 \(a\)\(b\) 的编号,若一个点与 \(a\) 有边相连且与 \(b\) 有边相连,则这个点必定是满足条件的点 \(c\)。使用 bitset 可以比较方便地解决这个问题。

Code

#include<bits/stdc++.h>
using namespace std;
long long n,ans;
bitset<3005> m[3005];
char t;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>t;
			if(t=='1') m[i][j]=1;
			else m[i][j]=0;
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(m[i][j]){
				ans+=(long long)((m[i]&m[j]).count());//满足条件的c点个数
			}
		}
	}
	cout<<ans/6<<endl;//统计出的结果有一定的重复,需要除以6后再输出
	return 0;
}