zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    nopCommerce中缓存学习
    EF
    路由
    webapi的加密方式
    生成N位数字随机数
    C# DataTable 转 实体类
    WebBrowser 打印
    文件上传控件,格式统一
    sqlserver 表循环-游标、表变量、临时表
    VB 老旧版本维护系列---迷之集合- dataTable
  • 原文地址:https://www.cnblogs.com/Yokel062/p/11482732.html
Copyright © 2011-2022 走看看