2208: [Jsoi2010]连通数
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1500 Solved: 612
[Submit][Status][Discuss]
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。
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; vector<int> e[2010]; int n; char s[2010]; bool vis[2010]; int ans; void dfs(int u) { vis[u]=1; ans++; for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if(!vis[v]) { dfs(v); } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); for(int j=1;j<=n;j++) { if(s[j]=='1') e[i].push_back(j); } } for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); dfs(i); } printf("%d ",ans); return 0; }