题解
- 这里并没有限定为无向图,所以只有从每个顶点出发,经过深度或者广度优先遍历都能到达其他顶点时,图才是强连通图。
题目
问题 C: 图的应用之——图的连通
时间限制: 1 Sec 内存限制: 128 MB
提交: 601 解决: 301
[提交][状态][讨论版]
题目描述
给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。
--程序要求--
若使用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表示图是否是强连通图
样例输入
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
样例输出
Yes
No
代码1(DFS)
#include <iostream>
using namespace std;
class Graph
{
private:
int vexnum;
int **matrix;
int *visited;
int Next(int vex);
void DFS(int vex1);
public:
Graph();
~Graph();
void DFSTraverse();
};
Graph::Graph()
{
int i, j;
cin>>vexnum;
matrix = new int*[vexnum];
visited = new int[vexnum];
for(i=0; i<vexnum; i++)
{
matrix[i] = new int[vexnum];
visited[i] = 0;
for(j=0; j<vexnum; j++)
cin>>matrix[i][j];
}
}
Graph::~Graph()
{
for(int i=0; i<vexnum; i++)
delete []matrix[i];
delete []visited;
}
int Graph::Next(int vex)
{
int i;
for(i=0; i<vexnum; i++)
{
if(matrix[vex][i] && !visited[i])
return i;
}
return -1;
}
void Graph::DFS(int vex1)
{
visited[vex1] = 1;
int vex2 = Next(vex1);
while(vex2+1)
{
DFS(vex2);
vex2 = Next(vex1);
}
}
void Graph::DFSTraverse()
{
int i, j, k, count;
int pos = 0;
for(j=0; j<vexnum; j++)
{
count = 0;
k = j;
for(i=0; i<vexnum; i++)
{
if(!visited[k])
{
DFS(k);
count++;
}
k = (k+1)%vexnum;
}
if(count!=1)
pos = 1;
for(i=0; i<vexnum; i++)
visited[i] = 0;
}
if(pos)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
Graph myGraph;
myGraph.DFSTraverse();
}
}
代码2(BFS)
#include <iostream>
#include <queue>
using namespace std;
class Graph
{
private:
int vexnum;
int **matrix;
public:
Graph();
~Graph();
int BFS();
};
Graph::Graph()
{
cin>>vexnum;
matrix = new int*[vexnum];
for(int i=0; i<vexnum; i++)
{
matrix[i] = new int[vexnum];
for(int j=0; j<vexnum; j++)
cin>>matrix[i][j];
}
}
Graph::~Graph()
{
for(int i=0; i<vexnum; i++)
delete []matrix[i];
delete matrix;
}
int Graph::BFS()
{
int i, j;
for(i=0; i<vexnum; i++)
{
int s[vexnum];
for(j=0; j<vexnum; j++)
s[j] = 0;
queue<int> q;
q.push(i);
s[i] = 1;
while(!q.empty())
{
int vex = q.front();
q.pop();
for(j=0; j<vexnum; j++)
if(matrix[vex][j] && !s[j])
{
q.push(j);
s[j] = 1;
}
}
for(j=0; j<vexnum; j++)
if(!s[j])
return 0;
}
return 1;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
Graph myGraph;
if(myGraph.BFS())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}