Gym - 100342J:Triatrip(Bitset加速求三元环的数量)

题意:求有向图里面有多少个三元环。

思路:枚举起点A,遍历A可以到的B,然后求C的数量,C的数量位B可以到是地方X集合,和可以到A的地方Y集合的交集(X&Y)。

B点可以枚举,也可以遍历。(两种都试过,区别不大。)

枚举代码:

#include<cstdio>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1510;
bitset<maxn>s[maxn];
bitset<maxn>f[maxn];
char c[maxn]; long long ans;
int main()
{
    freopen("triatrip.in","r",stdin);//必须加上,不然得WA
    freopen("triatrip.out","w",stdout);
    int N,i,j;
    scanf("%d",&N);
    for(i=1;i<=N;i++){
       scanf("%s",c+1);
       for(j=1;j<=N;j++){
         if(c[j]==‘+‘){
           s[i].set(j);
           f[j].set(i);
         }
       }
    }
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
          if(s[i][j])
              ans+=(s[j]&f[i]).count();
    printf("%lld\n",ans/3);
    return 0;
}

遍历代码:

#include<cstdio>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1510;
bitset<maxn>s[maxn];
bitset<maxn>f[maxn];
const int maxm=2250010; char c[maxn];
int Laxt[maxn],Next[maxm],To[maxm],cnt;
long long ans;
void update(int N)
{
    for(int i=1;i<=N;i++) s[i].reset();
    for(int i=1;i<=N;i++) f[i].reset();
    memset(Laxt,0,sizeof(Laxt));
    cnt=ans=0;
}
void add(int u,int v)
{
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
}
int main()
{
    freopen("triatrip.in","r",stdin);//必须加上,不然得WA
    freopen("triatrip.out","w",stdout);
    int N,i,j;
    while(~scanf("%d",&N)){
        update(N);
        for(i=1;i<=N;i++){
           scanf("%s",c+1);
           for(j=1;j<=N;j++){
                  if(c[j]==‘+‘){
                         add(i,j);
                         s[i].set(j);
                         f[j].set(i);
                  }
           }
        }
        for(i=1;i<=N;i++){
            for(j=Laxt[i];j;j=Next[j]){
                int u=To[j];
                ans+=(s[u]&f[i]).count();
            }
        }
        printf("%lld\n",ans/3);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/8537840.html

时间: 2024-10-29 19:09:46

Gym - 100342J:Triatrip(Bitset加速求三元环的数量)的相关文章

Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attachments Description The travel agency “Four Russians” is offering the new service for their clients. Unlike other agencies that only suggest one-way

Gym - 100342J Triatrip (bitset求三元环个数)

https://vjudge.net/problem/Gym-100342J 题意:给出一个邻接矩阵有向图,求图中的三元环的个数. 思路: 利用bitset暴力求解,记得最后需要/3. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #incl

codeforce Gym 100342J Triatrip (bitset)

傻逼题,但是为什么别人的O(n^3)不会T?只是因为用了bitset优化... 附上一张bitset基本操作的表 #include<bits/stdc++.h> using namespace std; const int maxn = 1500+2; char g[maxn][maxn]; bitset<maxn> b1[maxn],b2[maxn],res; #define local int main() { #ifdef local freopen("triatr

无向图求三元环

http://acm.xidian.edu.cn/problem.php?id=1187 问题重述:给一个无向图,求其中包含 3 个结点的环的个数. 题解 暴力玄学,枚举边然后双指针扫描两个端点的邻集.注意用结点的顺序 关系去重,最后除以 3 会超时的.时间复杂度应该是 O(nm),不知道怎么过的. 网上 O(m√m) 的反而过不了. 注意如何避免除以三的遍历方式. 1 #include<cstdio> 2 #include<cstring> 3 #include<algor

Codeforces Gym 100342J Problem J. Triatrip 三元环

题目链接: http://codeforces.com/gym/100342 题意: 求三元环的个数 题解: 用bitset分别统计每个点的出度的边和入度的边. 枚举每一条边(a,b),计算以b为出度的边的终点构成的点集和以a为入度的边的起点够成的点集的交集,更新答案. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<bitset> using namespace std;

Gym 100342J &amp; Gym 100345H (bitset在图论题的应用)

bitset bitset在某些常数优化以及状态保存方面被称之为神器并不为过,主要表现在以下几个方面: 1. 状态表示.试想,用一个数来表示状态的极限是64位,而bitset可以保存任意位二进制数,并且修改简单,统计方便,并且支持批量操作. 2. 常数优化.图论的题,尤其涉及不带权的邻接图,算法经常动辄 n2,n3 ,这个时候我们可以用n个bitset存储每个点的邻接情况,并进行相应位操作,来替代直接遍历图的操作,经常可以将总复杂度降低为原来的1/32甚至还要少! 3. 集合运算.交集按位与,并

三元环HDU 6184

HDU - 6184 C - Counting Stars 题目大意:有n个点,m条边,问有一共有多少个‘structure’也就是满足V=(A,B,C,D) and E=(AB,BC,CD,DA,AC)这样一个图形,类似于四边形中间连接了一条对角线. 如果我们把这个四边形拆分的话,其实就是两个共用一条边的三角形,而在图中就是三元环.求三元环有两种求法,个人感觉这个三元环的时间复杂度很玄学. 第一种一种就是枚举点x,然后枚举和点x相连的y,这时根据y的度,如果y的度小于等于sqrt(m),那么我

三元环:在数集中求有多少个三元子集中的元素两两互质

2.14在杭二参加集训,校园好美!!!QAQ 杜教在下午为大家做了上午三题的讲解和一些CF杂题的选讲,其中有在图上求所有三元环的算法.这个算法不是很复杂,但还是蛮有趣的啦QWQ 我们已有一些整数,记作a1,a2,...,an.我们希望求出这些数中有多个含有三个元素的子集满足题目的条件,即{ai,aj,ak}中(ai,aj)=1且(ai,ak)=1且(aj,ak)=1. 第一步,建图.将a1,a2,...an分别作为编号为1,2,...,n的点处理,且如果ai和aj互质,那么结点i和结点j之间建立

竞赛图如何构造三元环

讲解视频 一场NOIp模拟赛的T3里看到的一个东西,因为那道题目不开放评测,所以简单写一下. 假设存在这样一张竞赛图,其中存在这样一个环 $node_a \rightarrow node_b \rightarrow node_c \rightarrow node_d \rightarrow node_e \rightarrow node_a$ 首先明确,这是一个竞赛图,对于任意的$node_a$和$node_b$,要么存在$node_a \rightarrow node_b$要么存在$node_