• BZOJ 2208 [Jsoi2010]连通数


    Description

    Input

    输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

    Output

    输出一行一个整数,表示该图的连通数。

    Sample Input

    3
    010
    001
    100

    Sample Output

    9
     
    题意:求相连的对数。
    题解:此类题目有以下2种解法。
    1、缩点重构后,在DAG上递推使用拓扑排序更高效,直接dfs时间复杂度没有保证,很可能TLE
    2、如需对二进制位统一处理(位运算),使用bitset,能通过压位快32倍!
     
    解法2:
    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn=2005;
    bitset<maxn> g[maxn];
    int n;
    char s[maxn];
    
    int main()
    {
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%s", s);
            for(int j=0; j<n; j++)
                g[i][j]= s[j]=='0'? 0:1;
        }
        for(int i=0; i<n; i++) g[i][i]=1; //注意题目给的i和i是不相连的
        for(int k=0; k<n; k++)  //求传递闭包所利用的点
            for(int i=0; i<n; i++) //起点
                if(g[i][k]) g[i]|=g[k];  
        int ans=0;
        for(int i=0; i<n; i++)
            ans+=g[i].count();
        printf("%d
    ", ans);
        return 0;
    }
    View Code
  • 相关阅读:
    sort
    Sicily--17956. Maximum Multiple
    代码1005
    487-3279的解法实例
    487-3279另一种解法
    487-3279
    人工智能--识别句子
    1003-Hangover
    推荐书单(转自GITHUB)
    转自微信号:测试那点事
  • 原文地址:https://www.cnblogs.com/Yokel062/p/11482732.html
Copyright © 2020-2023  润新知