#include<iostream>
#include<limits>
#include <iomanip>//控制cout的输出格式的函数所需要的头文件
#define vertex_type char
#define weight_type int
#define VERMAX 20
using namespace std;
enum gragh_type{DG,UDG,DN,UDN};//D-directed UD-undirected G-gragh N-net
struct Mgragh
{
vertex_type vertex[VERMAX];
weight_type arcs[VERMAX][VERMAX];
gragh_type kind;
int ver_num;
int arc_num;
};
class Gragh
{
private:
Mgragh gragh;
public:
Gragh(){}
~Gragh(){}
void DG();
void UDG();
void DN();
void UDN();
void show_gragh();
int loc_vex(Mgragh G,vertex_type v);
};
int main()
{
Gragh my_gragh;
my_gragh.DN();
my_gragh.show_gragh();
return 0;
}
void Gragh::DG()//create an directed gragh
{
cout << "输入顶点数:";
cin >> gragh.ver_num;
cout << "输入弧数:";
cin >> gragh.arc_num;
cout << "输入顶点名称(空格隔开):";
for (int i = 0; i < gragh.ver_num; i++)
{
cin >> gragh.vertex[i];
}
for (int i = 0; i < gragh.ver_num; i++)
{
for (int k = 0; k < gragh.ver_num; k++)
{
gragh.arcs[i][k] = 0;
}
}
for (int i = 0; i < gragh.arc_num; i++)
{
vertex_type x, y;
cout << "输入弧头,弧尾(空格隔开):";
cin >> x >> y;
int m = loc_vex(gragh,x);
int n = loc_vex(gragh,y);
if (m == -1 || n == -1)
{
cout << "未定位到弧头或弧尾";
exit(1);
}
gragh.arcs[m][n] = 1;
}
}
void Gragh::UDG()
{
cout << "输入顶点数:";
cin >> gragh.ver_num;
cout << "输入边数:";
cin >> gragh.arc_num;
cout << "输入顶点名称(空格隔开):";
for (int i = 0; i < gragh.ver_num; i++)
{
cin >> gragh.vertex[i];
}
for (int i = 0; i < gragh.ver_num; i++)
{
for (int k = 0; k < gragh.ver_num; k++)
{
gragh.arcs[i][k] = 0;
}
}
for (int i = 0; i < gragh.arc_num; i++)
{
vertex_type x, y;
cout << "输入相连顶点(空格隔开):";
cin >> x >> y;
int m = loc_vex(gragh, x);
int n = loc_vex(gragh, y);
if (m == -1 || n == -1)
{
cout << "未定位到顶点";
exit(1);
}
gragh.arcs[m][n] = gragh.arcs[n][m] = 1;//无向图邻接矩阵沿主对角线对称
}
}
void Gragh::UDN()
{
cout << "输入顶点数:";
cin >> gragh.ver_num;
cout << "输入边数:";
cin >> gragh.arc_num;
cout << "输入顶点名称(空格隔开):";
for (int i = 0; i < gragh.ver_num; i++)
{
cin >> gragh.vertex[i];
}
for (int i = 0; i < gragh.ver_num; i++)
{
for (int k = 0; k < gragh.ver_num; k++)
{
gragh.arcs[i][k] = 0;
}
}
for (int i = 0; i < gragh.arc_num; i++)
{
vertex_type x, y;
weight_type w;
cout << "输入相连两顶点以及权值(空格隔开):";
cin >> x >> y >> w;
int m = loc_vex(gragh, x);
int n = loc_vex(gragh, y);
if (m == -1 || n == -1)
{
cout << "未定位到顶点";
exit(1);
}
gragh.arcs[m][n] = gragh.arcs[n][m] = w;
}
}
void Gragh::DN()
{
cout << "输入顶点数:";
cin >> gragh.ver_num;
cout << "输入弧数:";
cin >> gragh.arc_num;
cout << "输入顶点名称(空格隔开):";
for (int i = 0; i < gragh.ver_num; i++)
{
cin >> gragh.vertex[i];
}
for (int i = 0; i < gragh.ver_num; i++)
{
for (int k = 0; k < gragh.ver_num; k++)
{
gragh.arcs[i][k] = 0;
}
}
for (int i = 0; i < gragh.arc_num; i++)
{
vertex_type x, y;
weight_type w;
cout << "输入弧头,弧尾以及权值(空格隔开):";
cin >> x >> y >> w;
int m = loc_vex(gragh, x);
int n = loc_vex(gragh, y);
if (m == -1 || n == -1)
{
cout << "未定位到弧头或弧尾";
exit(1);
}
gragh.arcs[m][n] = w;
}
}
int Gragh::loc_vex(Mgragh G,vertex_type v)
{
for (int i = 0; i < G.ver_num; i++)
{
if (G.vertex[i] == v)
return i;
}
return -1; //找不到顶点,返回-1
}
void Gragh::show_gragh()
{
cout <<setw(6)<<gragh.vertex[0]; //setw()控制cout的输出格式,setw(6)表示输出宽度为6
for (int i = 1; i < gragh.ver_num; i++)
cout << setw(3) << gragh.vertex[i];
cout << endl;
for (int i = 0; i < gragh.ver_num; i++)
{
cout << setw(3) << gragh.vertex[i];
for (int k = 0; k < gragh.ver_num; k++)
{
cout << setw(3) << gragh.arcs[i][k];
}
cout << endl;
}
}
邻接矩阵的创建(有向,无向,网,图)
最新推荐文章于 2022-11-16 23:40:44 发布