图的应用之——图的连通
题目描述
给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。
–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
输入
第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;
int n;
int arr[100][100];
int v[100];
void dfs(int hang){
v[hang]=1;
for (int i = 0; i < n; ++i) {
if(arr[hang][i]!=0&&v[i]==0)dfs(i);
}
}
int go(){
int f=0;
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
v[i]=0;
}int c=0;
for (int i = k; i < n; ++i) {
if(v[i]==0) {
dfs(i); c++;
}
}
for (int i = k-1; i >=0; --i) {
if(v[i]==0){dfs(i);c++;}
}
f+=c;
}return f;
}
int main(){
int t;cin>>t;
while (t--){
cin>>n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin>>arr[i][j];
}
}
if(go()==n) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}