bzoj 2208: [Jsoi2010]连通数
一看就是缩点拓扑啊,可数据范围这么小,暴力即可啊。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8 #include<vector> 9 #define M 1000009 10 #define EPS 1e-10 11 #define MO 19650827 12 #define ll long long 13 using namespace std; 14 ll read() 15 { 16 char ch=getchar(); 17 ll x=0,f=1; 18 for(;ch<'0'||ch>'9';ch=getchar()) 19 if(ch=='-') 20 f=-1; 21 for(;ch>='0'&&ch<='9';ch=getchar()) 22 x=x*10+ch-'0'; 23 return x*f; 24 } 25 int f[M],ans,cnt,n,head[M],next[M],u[M]; 26 char ch[M]; 27 void jia(int a1,int a2) 28 { 29 cnt++; 30 next[cnt]=head[a1]; 31 head[a1]=cnt; 32 u[cnt]=a2; 33 } 34 void dfs(int x,int y) 35 { 36 f[y]=x; 37 ans++; 38 for(int i=head[y];i;i=next[i]) 39 if(f[u[i]]<x) 40 dfs(x,u[i]); 41 } 42 int main() 43 { 44 n=read(); 45 for(int i=1;i<=n;i++) 46 { 47 scanf("%s",ch+1); 48 for(int j=1;j<=n;j++) 49 if(ch[j]=='1') 50 jia(i,j); 51 } 52 for(int i=1;i<=n;i++) 53 dfs(i,i); 54 printf("%d\n",ans); 55 return 0; 56 } 57