题目描述
给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。
输入
第1行输入一个整数k,表示有k个测试数据
第2行输入一个整数n,表示有n个结点
从第3行起到第n+2行输入一个邻接矩阵,其中Matrix[i,j]=1表示第i,j个结点之间有边,否则不存在边。
接下来是第2到第k个测试数据的结点数和邻接矩阵
输出
输出Yes or No表示图是否是强连通图
输入样例1
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
输入样例1
Yes
No
代码
#include<iostream>
using namespace std;
#define MaxLen 20
class Graph {
private:
int vexnum;
bool Visited[MaxLen];
string vex[MaxLen];
int matrix[MaxLen][MaxLen];
void DFS(int vex) {
for (int i = 0; i < vexnum; i++) {
if (matrix[vex][i] == 1 && Visited[i] == false) {
Visited[i] = true;
DFS(i);
}
}
}
public:
void SetMatrix() {
cin >> vexnum;
for (int i = 0; i < vexnum; i++)
for (int j = 0; j < vexnum; j++)
cin >> matrix[i][j];
}
void setVisit() {
for (int i = 0; i < vexnum; i++)
Visited[i] = false;
}
void display() {
int tag = 0;
for (int i = 0; i < vexnum; i++) {
setVisit();
Visited[i] = true;
DFS(i);
for (int i = 0; i < vexnum; i++) {
if (Visited[i] == false) {
tag = 1;
break;
}
}
if (tag == 1)
break;
}
if (tag == 1)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
};
int main() {
int n;
cin >> n;
while (n--) {
Graph map;
map.SetMatrix();
map.display();
}
return 0;
}