暴力【bzoj2208】: [Jsoi2010]连通数

2208: [Jsoi2010]连通数

暴力过的。

没脸说。。。

正解好像是缩点+递推。

应该也不难写。

code:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int wx=4017;

inline int read(){
	int sum=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
	return sum*f;
}

int num,n,m,ans,vis[wx];
int head[wx];

struct e{
	int nxt,to;
}edge[wx*200];

void add(int from,int to){
	edge[++num].nxt=head[from];
	edge[num].to=to;
	head[from]=num;
}

void dfs(int u,int top){
	vis[u]=1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(vis[v])continue;
		ans++;
		dfs(v,top);
	}
}

char c[wx];

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		scanf("%s",c+1);
		for(int j=1;j<=n;j++){
			int x=c[j]-'0';
			if(x)add(i,j);
		}
	}
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof vis);
		dfs(i,i);
	}
	printf("%d\n",ans+n);
	return 0;
}
posted @ 2018-10-19 16:48  _王小呆  阅读(158)  评论(0编辑  收藏  举报