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

版权声明:欢迎学习我的博客,希望ACM的发展越来越好~ https://blog.csdn.net/qq_41289920/article/details/88033284

题干:

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

猜你喜欢

转载自blog.csdn.net/qq_41289920/article/details/88033284