Description
度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数。
下图的连通数是14
现在要你求出连通数
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);
}