题干:
给你一个二维字符矩阵,如果 ( i , j ) 为+ 表明 两点之间有一条有向边,为-表示没有边,那么你要找出所有的三元环的个数。顶点数N<=1500。
解题报告:
考虑最暴力的方法,开个二维数组来存每两个顶点之间的邻接关系,但是N^3肯定是会TLE的,考虑bitset压位优化。(神奇)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1500 + 10;
bitset<N> in[N], out[N];
int a[N][N], ans;
int main()
{
int n;
long long ans = 0;
char c;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j) {
cin >> c;
if(c == '+') {
a[i][j] = 1;
out[i][j] = 1;
in[j][i] = 1;
}
}
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
if(a[i][j])
ans += (out[j] & in[i]).count();
cout << ans / 3 << endl;
return 0;
}
/*
4
--+-
+--+
-+--
--+-
4
+++-
+++-
+++-
---+
4
++++
++++
++++
++++
3
+++
+++
+++
*/