问题 E: DS图—图的连通分量
题目描述
输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构,计算图的连通分量个数。
输入
测试次数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<string>
using namespace std;
class Map
{
public:
int vn,ln;
string *name;
bool visit[20];
int graph[20][20];
int sum;
void initialize()
{
cin >> vn;
name=new string[vn];
for(int i=0;i<vn;i++)
cin >> name[i];
cin >> ln;
for(int i=0;i<vn;i++)
for(int j=0;j<vn;j++)
graph[i][j]=0;
for(int i=0;i<ln;i++)
{
string a,b;
cin >> a >> b;
int index1,index2;
index1=find(a);
index2=find(b);
graph[index1][index2]=1;
graph[index2][index1]=1;
}
sum=0;
}
int find(string t)
{
for(int i=0;i<vn;i++)
if(name[i].compare(t)==0)return i;
}
void DfsTraverse()
{
for(int i=0;i<vn;i++)
visit[i]=false;
for(int i=0;i<vn;i++){
if(!visit[i]){
DFS(i);
sum++;
}
}
}
void DFS(int v)
{
visit[v]=true;
int* temp=new int[vn];
// for(int i=0;i<vn;i++)
// temp[i]=-1;
int pos=0;
for(int i=0;i<vn;i++)
if(graph[v][i])temp[pos++]=i;
for(int i=0;i<pos;i++)
if(!visit[temp[i]])DFS(temp[i]);
delete[] temp;
}
void print()
{
for(int i=0;i<vn;i++){
if(i==0)cout << name[i];
else cout << ' ' << name[i];
}
cout << endl;
for(int i=0;i<vn;i++){
for(int j=0;j<vn;j++){
if(j==0)cout << graph[i][j];
else cout << ' ' << graph[i][j];
}
cout << endl;
}
cout << sum << endl << endl;
}
};
int main()
{
int t;
cin >> t;
while(t--){
Map mygraph;
mygraph.initialize();
mygraph.DfsTraverse();
mygraph.print();
}
return 0;
}
运行结果
目的
一个笔记