BZOJ2208: [Jsoi2010]连通数

2208: [Jsoi2010]连通数

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1235  Solved: 488
[Submit][Status]

Description

Input

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

Output

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

Sample Input

3
010
001
100

Sample Output

9

HINT

 

对于100%的数据,N不超过2000。

 

Source

题解:
看着正解好麻烦,敲了个暴力,结果就过了!过了。。。我还想如果不过的话,就先tarjan一下,在dfs。。。
从每个点开始dfs出它能到达的的点ans++
代码:
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #define inf 1000000000
12 #define maxn 2000+100
13 #define maxm 4000000+1000
14 #define eps 1e-10
15 #define ll long long
16 using namespace std;
17 int n,ans,tot,head[maxn],next[maxm],go[maxm];
18 bool v[maxn];
19 inline int read()
20 {
21     int x=0,f=1;char ch=getchar();
22     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
23     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
24     return x*f;
25 }
26 inline void dfs(int x)
27 {
28     v[x]=1;ans++;
29     for(int i=head[x];i;i=next[i])if(!v[go[i]])dfs(go[i]);
30 }
31 int main()
32 {
33     freopen("input.txt","r",stdin);
34     freopen("output.txt","w",stdout);
35     n=read();char ch;
36     for(int i=1;i<=n;i++)
37     {
38      for(int j=1;j<=n;j++)
39      {
40          ch=' ';while(ch<'0'||ch>'1')ch=getchar();
41          if(ch=='1')
42          {
43             go[++tot]=j;next[tot]=head[i];head[i]=tot;
44          }
45      }
46     }  
47     ans=0;
48     for(int i=1;i<=n;i++)
49     {
50         memset(v,0,sizeof(v));
51         dfs(i);
52     }
53     printf("%d\n",ans);
54 }
View Code

 

posted @ 2014-08-21 12:23  ZYF-ZYF  Views(265)  Comments(0Edit  收藏  举报