题目背景
小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同意,禁止转载,侵权者必究。