DS图—图的连通分量(待验证)
程序员文章站
2022-05-21 12:11:13
...
题解:
- 求图的连通分量就是使用深度或者广度优先遍历,用一个变量记录遍历过程中囊括了多少个连通分量就行了。
题目:
问题 E: DS图—图的连通分量
时间限制: 1 Sec 内存限制: 128 MB
提交: 495 解决: 317
[提交][状态][讨论版]
题目描述
输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构,计算图的连通分量个数。
输入
测试次数t
每组测试数据格式如下:
第一行:顶点数 顶点信息
第二行:边数
第三行开始,每行一条边信息
输出
每组测试数据输出,顶点信息和邻接矩阵信息
输出图的连通分量个数,具体输出格式见样例。
每组输出直接用空行分隔。
样例输入
3
4 A B C D
2
A B
A C
6 V1 V2 V3 V4 V5 V6
5
V1 V2
V1 V3
V2 V4
V5 V6
V3 V5
8 1 2 3 4 5 6 7 8
5
1 2
1 3
5 6
5 7
4 8
样例输出
A B C D
0 1 1 0
1 0 0 0
1 0 0 0
0 0 0 0
2
V1 V2 V3 V4 V5 V6
0 1 1 0 0 0
1 0 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 0
0 0 1 0 0 1
0 0 0 0 1 0
1
1 2 3 4 5 6 7 8
0 1 1 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 1 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
3
代码块:
#include <iostream>
#include <queue>
using namespace std;
class Graph
{
private:
int Vexnum;
int Edgenum;
bool *Visit;
int **Matrix;
string *Vertex;
public:
Graph();
~Graph();
void SetMatrix();
void BFS();
};
Graph::Graph()
{
cin>>Vexnum;
Vertex = new string[Vexnum];
Matrix = new int*[Vexnum];
Visit = new bool[Vexnum];
for(int i=0; i<Vexnum; i++)
{
Matrix[i] = new int[Vexnum];
}
}
Graph::~Graph()
{
delete []Vertex;
delete []Visit;
for(int i=0; i<Vexnum; i++)
{
delete []Matrix[i];
}
delete Matrix;
}
void Graph::SetMatrix()
{
int i, j, k;
for(i=0; i<Vexnum; i++)
Visit[i] = false;
for(i=0; i<Vexnum; i++)
cin>>Vertex[i];
for(i=0; i<Vexnum; i++)
cout<<Vertex[i]<<' ';
cout<<endl;
cin>>Edgenum;
string a, b;
for(i=0; i<Vexnum; i++)
{
for(j=0; j<Vexnum; j++)
Matrix[i][j] = 0;
}
for(i=0; i<Edgenum; i++)
{
cin>>a>>b;
for(j=0; j<Vexnum; j++)
{
if(a==Vertex[j])
break;
}
for(k=0; k<Vexnum; k++)
{
if(b==Vertex[k])
break;
}
Matrix[j][k] = 1;
Matrix[k][j] = 1;
}
for(i=0; i<Vexnum; i++)
{
for(j=0; j<Vexnum; j++)
{
if(j!=Vexnum-1)
cout<<Matrix[i][j]<<' ';
else
cout<<Matrix[i][j];
}
cout<<endl;
}
}
void Graph::BFS()
{
int v, u, i;
int k = 0;
int j = 0;
int *AdjVex = new int[Vexnum];
queue<int> Q;
for(v=0; v<Vexnum; v++)
{
if(!Visit[v])
{
j++;
Visit[v] = true;
Q.push(v);
while(!Q.empty())
{
u = Q.front();
Q.pop();
for(i=0; i<Vexnum; i++)
{
if(Matrix[u][i]==1 && Visit[i]==0)
{
AdjVex[k] = i;
k++;
}
}
for(i=0; i<k; i++)
{
Visit[AdjVex[i]] = true;
Q.push(AdjVex[i]);
}
k = 0;
}
}
}
delete []AdjVex;
cout<<j<<endl;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
Graph myGraph;
myGraph.SetMatrix();
myGraph.BFS();
}
return 0;
}
上一篇: 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
下一篇: 求图的连通分量