题目背景

小Z最近喜欢上了图论,于是他研究了一下图的连通性问题。但是他遇到了一个难题。

题目描述

给定一个n个点的有向图,求有多少点对(i,j)满足从i点出发能到达点j ?

小Z仅会简单的朴素算法,所以他想问问你怎么解决。你能帮帮他吗?

输入输出格式

输入格式:

 

第一行一个数字n,表示有n个点。

接下来n行,每行n个0/1,如果第i行第j个是1,表示从第i个点向第j个点有连边。

 

输出格式:

 

输出仅包含一个数,表示满足条件的点对数量。

 

输入输出样例

输入样例#1:
3
0 1 0
0 0 1
1 0 0
输出样例#1:
9

说明

样例中,从任意一个点出发均可到达其它所有点(包括自己)

对于50%的数据,满足n<=500

对于100%的数据,满足n<=2000

注意i和j可以相同

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
#define For(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int read(){
    int t=1,num=0;
    char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
    return num*t;
}
int ans=0,n;
bitset<2010> b[2010];
int main()
{
    n=read();
    For(i,1,n)For(j,1,n)b[i][j]=(read()|(i==j));
    For(k,1,n)For(i,1,n)if(b[i][k])b[i]|=b[k];
    For(i,1,n)ans+=b[i].count();
    printf("%d",ans);
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-05-28 17:16  Yzyet  阅读(168)  评论(0编辑  收藏  举报