//网图(带权值)的邻接矩阵
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int INFINIT = 0x3f3f3f3f;
const int MAXVAX = 100;
template<class T>
class MGraph {
private:
T * vertex; //数组,用来存放顶点信息
int ** arc; //二维数组,用来存放邻接矩阵
int vertexNum, arcNum; //顶点数量 边数
public:
MGraph(T v[], int n, int e);
~MGraph();
void display();
void BFS(int i,int * visited);
void BFSTraverse(int * visited);
};
template<class T>
void MGraph<T>::BFS(int i,int * visited){
queue<int> q;
visited[i] = 1;
q.push(i);
while(!q.empty()){
int temp = q.front();
cout<<vertex[temp]<<" ";
q.pop();
for(int j=0;j<vertexNum;j++){
if(!vertex[i]&&arc[i][j]!=0&&arc[i][j]!=INFINIT){
visited[j] = 1;
q.push(j);
}
}
}
cout<<"\n";
}
template<class T>
void MGraph<T>::BFSTraverse(int * visited){
for(int i=0;i<vertexNum;i++){
visited[i] = 0;
}
for(int i=0;i<vertexNum;i++){
if(!visited[i]){
BFS(i,visited);
}
}
}
template<class T>
MGraph<T>::MGraph(T v[], int n, int e) {
vertexNum = n;
arcNum = e;
vertex = new T[vertexNum];
//新建一个名为vertex的数组,该数组的元素个数为vertexNum,元素类型为T,用来存放顶点信息
arc = new int *[vertexNum]; //建立邻接矩阵
//新建一个名为arc的数组,该数组的元素个数为vertexNum,元素类型为int *,用来存放邻接矩阵
//其实就是二维数组
for (int i = 0; i < vertexNum; i++)
arc[i] = new int[vertexNum];
for (int i = 0; i < vertexNum; i++) {
//初始化顶点信息
vertex[i] = v[i];
}
for (int i = 0; i < vertexNum; i++) {
//初始化邻接矩阵
for (int j = 0; j < vertexNum; j++) {
if (i == j) {
arc[i][j] = 0;
} else arc[i][j] = INFINIT;
}
}
int vi, vj, w;
for (int i = 0; i < arcNum; i++) {
cout << "请输入边的两个顶点和这条边的权值" << endl;
cin >> vi >> vj >> w; //输入边依附的两个顶点的编号和权值
arc[vi][vj] = w;
}
}
template<class T>
void MGraph<T>::display() {
for (int i = 0; i < vertexNum; i++) {
cout << vertex[i] << "\t";
}
cout << endl;
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
if (arc[i][j] == INFINIT)
cout << "∞" << "\t";
else cout << arc[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
template <class T>
MGraph<T>::~MGraph() {
delete[] vertex;
for (int i = 0; i < vertexNum; i++) {
delete[] arc[i];
}
delete[] arc;
cout<<"删除节点数组和邻接矩阵成功!"<<endl;
}
int main() {
static int visited[MAXVAX] = {0};
int num,num1;
cout << "请输入节点的数量:" << endl;
cin >> num;
cout << "请输入边的数量:" << endl;
cin >> num1;
cin.get();
char *v[num] = {0};
memset(v, 0 ,sizeof(v));
cout << "请输入节点的信息:" << endl;
int i = num;
while(i--)
{
v[i]=new char[3];
gets(v[i]);
}
cin.sync();
cin.clear();
MGraph<char*> mgraph1(v, num, num1);
mgraph1.display();
cout<<"v数组的大小为:"<<sizeof(v)<<endl;
mgraph1.BFSTraverse(visited);
for(int j= 0;j< num;j++)
{
delete[] v[j];
}
// delete[] v;
//数组v是静态分配的,无需delete
cout<<"删除节点数组v成功!"<<endl;
return 0;
}
//int main() {
// static int visited[MAXVAX];
// char * v[5] = {(char*)"v0",(char*)"v1",(char*)"v2",(char*)"v3",(char*)"v4"};
// // char* v[5] = {"v0", "v1", "v2", "v3", "v4"};
//
// MGraph<char*> mgraph1(v, 5, 6);
// //之所以元素类型是char*,是因为输入的是“v0”字符串
// //由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的
//
// mgraph1.display();
//
// cout<<"v数组的大小为:"<<sizeof(v)<<endl;
// //v[5]是一个有5个元素的数组,元素的类型(指向char类型变量的)指针
// //一个指针占8个字节,所有v[5]占40个字节
//
// mgraph1.BFSTraverse(visited);
//
// return 0;
//}