bzoj2208 [Jsoi2010]连通数 dfs

来源:互联网 发布:中文编程系统 编辑:程序博客网 时间:2024/06/05 14:09

题意:求每个点出发能经过的点数,n<=2000。
这明显签到题吧喂,签到都太水了啊= =。跑的贼慢我好虚。结果还是过了。

#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e6+5;int n,m;int head[N],next[N],go[N],tot;long long ans,sum;bool vis[5005];char ch[N];inline void add(int x,int y){    go[++tot]=y;    next[tot]=head[x];    head[x]=tot;}inline void dfs(int x){    ++sum;    vis[x]=1;    for(int i=head[x];i;i=next[i])    {        int v=go[i];        if (!vis[v])dfs(v);    }}int main(){    scanf("%d",&n);    fo(i,1,n)    {        scanf("%s",ch+1);        fo(j,1,n)        {            int c=ch[j]-'0';            if (c)add(i,j);        }    }    fo(i,1,n)    {        sum=0;        memset(vis,0,sizeof(vis));        dfs(i);        ans+=sum;    }    printf("%lld\n",ans);}
原创粉丝点击