BZOJ2208:[JSOI2010]连通数(DFS)
Description
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
010
001
100
Sample Output
9
HINT
对于100%的数据,N不超过2000。
Solution
数据太水,对于每个点爆搜就能过
Code
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N (2005) 6 using namespace std; 7 8 struct edge{int to,next;} edge[N*N]; 9 int n,num_edge,head[N],ans; 10 char s[N]; 11 bool vis[N]; 12 13 void add(int u,int v) 14 { 15 edge[++num_edge].to=v; 16 edge[num_edge].next=head[u]; 17 head[u]=num_edge; 18 } 19 void Dfs(int x) 20 { 21 vis[x]=true; 22 for (int i=head[x]; i; i=edge[i].next) 23 if (!vis[edge[i].to]) 24 Dfs(edge[i].to); 25 } 26 27 int main() 28 { 29 scanf("%d",&n); 30 for (int i=1; i<=n; ++i) 31 { 32 scanf("%s",s); 33 for (int j=1; j<=n; ++j) 34 if (s[j-1]=='1') 35 add(i,j); 36 } 37 for (int i=1; i<=n; i++) 38 { 39 memset(vis,0,sizeof(vis)); 40 Dfs(i); 41 for (int j=1; j<=n; j++) ans+=vis[j]; 42 } 43 printf("%d",ans); 44 }