我不知道为什么之前两个月没写一篇博客今天就要写两篇可能是因为今天晚饭吃的比较饱心情舒畅
题目:
输入一个有向图的邻接矩阵,求有多少个三元环(A到B,B到C,C又回A)
Input
第一行给出数字N,3<=N<=1500.接下来N行N列给出数字矩阵
Output
如题
Sample Input
4
--+-
+--+
-+--
--+-
Sample Output
2
大意是给你一个邻接矩阵让你求三元环个数,给你的邻接矩阵i行j列的‘+’代表i和j之间有一条边
然后你就会了
后来看数据发现有的数据存在点可以跟自己连边,我之前加的傻逼剪枝是错的
然后我还算了下时间复杂度发现我就算不加这个傻逼剪枝我也会T掉
然后我还惊恐的发现要开long long
败 者 食 尘
我就学了一种傻逼结构叫做bitset,可以理解为一个bool数组,但是只能进行位运算,运算时间,占用空间比普通数组小很多
bitset中a(i,j)代表以i为起点且以j为终点的边是否存在
b(i,j)代表i为终点j为起点的边是否存在
然后再并一下,代表合并两条边,可以感性理解一下
#include<bits/stdc++.h> #define ll long long using namespace std; char mp[2010][2010];ll n,ans; bitset<2010>a[2010],b[2010],p; int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++) for (int j=1;j<=n;j++){ cin>>mp[i][j]; if(mp[i][j]=='+') a[i][j]=1,b[j][i]=1; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j])p=a[j]&b[i],ans+=p.count(); printf("%lld",ans/3); return 0; }