首先要了解什么是连通图,这是百度百科百度百科——连通图
1.并查集
【图论|判断图连通性的三种方法(并查集/dfs/bfs)】首先统计连通分量的个数,如果一个图中连通分量个数大于1则肯定不是连通图,等于1则是连通图。
int n,m,f[N];
int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;
i<=n;
i++) f[i]=i;
for(int i=1;
i<=m;
i++)
{
int x,y;
scanf("%d%d",&x,&y);
int r1=find(x);
int r2=find(y);
f[r2]=r1;
}
int k=0;
for(int i=1;
i<=n;
i++) if(f[i]==i) k++;
if(k==1) printf("yes\n");
else printf("no\n");
return 0;
}
2.dfs(邻接表/链式前向星)
如果一个图是连通的那么从任意一个点出发都能到达其它任何一个点,也就是只有一个连通分量。
邻接表版本
int vis[N],n,m;
vectorg[N];
void dfs(int s)
{
vis[s]=1;
for(int i=0;
i<(int)g[s].size();
i++)
{
int v=g[s][i];
if(!vis[v]) dfs(v);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;
i<=m;
i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
int flag=1;
for(int i=1;
i<=n;
i++)
{
if(!vis[i])
{
flag=0;
break;
}
}
if(flag) printf("yes\n");
else printf("no\n");
return 0;
}
链式前向星版本
int vis[N],n,m;
struct edge
{
int to,next;
}e[N];
int head[N],cnt;
void addedge(int u,int v)
{
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int s)
{
vis[s]=1;
for(int i=head[s];
i;
i=e[i].next)
{
int to=e[i].to;
if(!vis[to]) dfs(to);
}
}
int main()
{
scanf("%d%d",&n,&m);
cnt=0;
for(int i=1;
i<=m;
i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs(1);
int flag=1;
for(int i=1;
i<=n;
i++)
{
if(!vis[i])
{
flag=0;
break;
}
}
if(flag) printf("yes\n");
else printf("no\n");
return 0;
}
3.bfs
原理同dfs,改为队列即可。
int vis[N],n,m;
struct edge
{
int to,next;
}e[N];
int head[N],cnt;
void addedge(int u,int v)
{
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void bfs(int s)
{
queueq;
q.push(s);
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=1;
for(int i=head[now];
i;
i=e[i].next)
{
int to=e[i].to;
if(!vis[to]) q.push(to);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
cnt=0;
for(int i=1;
i<=m;
i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
bfs(1);
int flag=1;
for(int i=1;
i<=n;
i++)
{
if(!vis[i])
{
flag=0;
break;
}
}
if(flag) printf("yes\n");
else printf("no\n");
return 0;
}
推荐阅读
- CSC148H1 算法比较分析
- 因果推断在哈啰出行的实践探索
- leecode题解|「代码随想录」968.监控二叉树【贪心算法】力扣详解!
- C语言与C++编程|二叉树操作详解
- 链表|关于链表的经典OJ题
- 算法|不会有人2022年还不懂栈吧()
- 算法|【算法】【C语言进阶】C语言字符串操作宝藏级别汇总 strtok函数 strstr函数该怎么用(【超详细的使用解释和模拟实现】)
- 人工智能|PPF(Point Pair Features)原理及实战技巧
- 手撕|应对嵌入式校招面试手撕之——链表