11
17
2015
0

BZOJ2208-[JSOI2010]连通数

正解是tarjan强联通缩点,然而我意外地发现Floyd压位轻松过laugh

#include <cstdio>
unsigned f[2000][63];
int N;
int gc()
{
	char c=getchar();
	while (c!='0'&&c!='1')
		c=getchar();
	return (int)c-48;
}
int count(unsigned x)
{
	int res=0;
	while (x)
		res++,x&=(x-1);
	return res;
}
int main()
{
	scanf("%d",&N);
	for (int i=0;i<N;i++)
	{
		for (int j=0;j<N;j++)
		{
			int t=gc();
			if (t)
				f[i][j/32]|=(1<<(j%32));
		}
		f[i][i/32]|=(1<<(i%32));
	}
	for (int k=0;k<N;k++)
		for (int i=0;i<N;i++)
			if ((f[i][k>>5]>>(k&31))&1)
				for (int j=0;j<=(N-1)>>5;j++)
					f[i][j]|=f[k][j];
	int OUT=0;
	for (int i=0;i<N;i++)
		for (int j=0;j<=(N-1)/32;j++)
			OUT+=count(f[i][j]);
	printf("%d\n",OUT);
	return 0;
}
Category: 未分类 | Tags: | Read Count: 612

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com