Codeforces Gym 100342J Triatrip Bitset+枚举

9 篇文章 0 订阅
9 篇文章 0 订阅

题目大意:

给一个有向图(n<=1500),问有多少个三元环。

做法:

  • 用bitset保存每个点能到的点以及能到某个点的所有点
  • 对每个点(记为U)逐一枚举,再枚举该点能到达的点(记为V)
  • 将能到U点的bitset与V能到的点的bitset取交集,答案+=交集大小
  • 最终答案÷3即可

时间复杂度 O(n3) ,但是bitset将常数除以了32所以足够通过本题。

代码:

4543664WHU_FFTJAccepted13240 KB872 msGNU 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值