0
点赞
收藏
分享

微信扫一扫

【Codeforces - 找不到题号】三元环计数(bitset优化,压位)

题干:

 给你一个二维字符矩阵,如果 ( 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
+++
+++
+++
*/

 


举报

相关推荐

0 条评论