题目大意:
给一个有向图(n<=1500),问有多少个三元环。
做法:
- 用bitset保存每个点能到的点以及能到某个点的所有点
- 对每个点(记为U)逐一枚举,再枚举该点能到达的点(记为V)
- 将能到U点的bitset与V能到的点的bitset取交集,答案+=交集大小
- 最终答案÷3即可
时间复杂度 O(n3) ,但是bitset将常数除以了32所以足够通过本题。
代码:
4543664 | WHU_FFT | J | Accepted | 13240 KB | 872 ms | GNU G++ 4.9.2 |
---|
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1501;
bitset<maxn>p[maxn][2];
vector<int>v[maxn];
char str[3000];
int main()
{
freopen("triatrip.in","r",stdin);
freopen("triatrip.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",&str[1]);
for(int j=1;j<=n;j++)
if(str[j] == '+' )
{
v[i].push_back(j);
p[i][0].set(j);
//i点能到的点
p[j][1].set(i);
//能到i点的点
}
}
long long ans=0;
for(int i=1;i<=n;i++)
for(int j=0;j<(int)v[i].size();j++)
ans+=(p[ v[i][j] ][0] & p[i][1]).count();
printf("%lld\n",ans/3);
return 0;
}