Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数

Description

度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数。

下图的连通数是14

img

现在要你求出连通数

Input

输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

Output

输出一行一个整数,表示该图的连通数。

难得看到省选出这种简单题,难道是为了考链式前向星?

直接建边对每个点跑(dfs),对于到达的点直接(ans++),(即此时形成了点对.

这题貌似不能直接回溯,需要(memset)

代码

#include<cstdio>
#include<cstring>
#define R register
using namespace std;
int head[200008],tot,ans,n;
struct cod{int u,v;}edge[2200008];
char s[200008];
bool vis[200008];
inline void add(int x,int y)
{
	edge[++tot].u=head[x];
	edge[tot].v=y;
	head[x]=tot;
}
void dfs(int u)
{
	if(vis[u])return;
	ans++;vis[u]=true;
	for(R int i=head[u];i;i=edge[i].u)
	{
		if(!vis[edge[i].v])
		dfs(edge[i].v);
	}
}
int main()
{
	scanf("%d",&n);
	for(R int i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		for(R int j=1;j<=n;j++)
			if(s[j]=='1')add(i,j);
	}
	for(R int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof vis);
		dfs(i);
	}
	printf("%d",ans);
}
原文地址:https://www.cnblogs.com/-guz/p/9818002.html