#include<iostream>
#include<cstring>
#include<istream>
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 DFS(int i,int * visited);
void DFSTraverse(int * visited);
};
template<class T>
void MGraph<T>::DFS(int i,int * visited){
cout<<vertex[i]<<" ";
visited[i] = 1;
for(int j=0;j<vertexNum;j++){
if(visited[j] == 0&&arc[i][j] != 0 &&arc[i][j] != INFINIT){
DFS(j,visited);
}
}
}
template<class T>
void MGraph<T>::DFSTraverse(int * visited){
for(int i=0;i<vertexNum;i++){
visited[i] = 0;
}
for(int i=0;i<vertexNum;i++){
if(!visited[i]){
DFS(i,visited);
}
}
}
template<class T>
MGraph<T>::MGraph(T v[], int n, int e) {
vertexNum = n;
arcNum = e;
vertex = new T[vertexNum];
arc = new int *[vertexNum];
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] ;
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.DFSTraverse(visited);
for(int j= 0;j< num;j++)
{
delete[] v[j];
}
cout<<"删除输入数组v成功!"<<endl;
return 0;
}
