学校数据结构OJ上的题
Description
给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。
–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
Input
第1行输入一个整数k,表示有k个测试数据
第2行输入一个整数n,表示有n个结点
从第3行起到第n+2行输入一个邻接矩阵,其中Matrix[i,j]=1表示第i,j个结点之间有边,否则不存在边。
接下来是第2到第k个测试数据的结点数和邻接矩阵
2
4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
7
0 1 0 0 0 0 0
0 0 1 1 0 0 0
1 0 0 0 0 0 0
1 0 1 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 0 0 1 0 1 0
Output
输出Yes or No表示图是否是强连通图
Yes
No
写这道题最开始不明白什么是强连通图,弱连通图走了一些弯路
强连通图指的是在有向图中, 若对于每一对顶点v1和v2, 都存在一条从v1到v2和从v2到v1的路径,只是需要存在双向的路径即可,不强求每个点之间都有两条连线。
连通图一般都指无向图,任意两个点之间能连通就是连通图。
以下就是代码
#include<iostream>
using namespace std;
int gra[1000][1000],visit[1000];
int T, n;
void dfs(int i) {
visit[i] = 1;
for (int j = 0; j < n; j++) {
if (gra[i][j] == 1 && visit[j] == 0) {
dfs(j);
}
}
}
bool pd()
{
for (int i = 0; i < n; i++) {
visit[i] = 0;
}
for (int i = 0; i < n; i++) {
dfs(i);
for (int j = 0; j < n; j++) {
if (visit[j] == 0) {
return false;
}
}
for (int i = 0; i < n; i++) {
visit[i] = 0;
}
}
return true;
}
int main() {
cin >> T;
while (T--) {
cin >> n;
int cnt=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> gra[i][j];
if (gra[i][j])
cnt++;
}
visit[i] = 0;
}
if (pd())
cout << "Yes";
else
cout << "No";
if (T) {
cout << endl;
}
}
return 0;
}