jiaminw

1. 演示

无向图:   

       

 

有向网:       

 

 2. 代码

 1 #include <iostream>
 2 #include <unordered_map>
 3 #include <vector>
 4 #include <string>
 5 //storage graph by adjacency matrix
 6 using std::unordered_map;
 7 using std::vector;
 8 using std::string;
 9 enum graphType { UG, DG,UN,DN };          //无向图,有向图,无向网,有向网
10 class Graph{
11 public:
12     unordered_map<string,int> vertex2index;   //顶点的名字 ==》下标
13     vector<vector<int>> edjes;                //存储边的二维数组
14     int n, e;                                 //顶点数和边数
15     enum graphType type;                      //图的类型
16     Graph(int vNum=1,int eNum=0,enum graphType t=UG):
17         n(vNum),e(eNum),type(t){}
18     Graph* createGraph();
19     
20     void showGraph() {
21         std::cout << "开始显示图:\n";
22         auto ite = vertex2index.begin();
23         //打印节点名字横
24         std::cout << "    ";
25         for (; ite!=vertex2index.end(); ite++) {
26             std::cout<<(*ite).first << "  ";
27         }
28         std::cout << "\n";
29         //打印节点
30         ite = vertex2index.begin();
31         for (int i = 0; i < n; i++) {
32             //打印节点名字竖
33             std::cout << (*ite++).first << "  ";
34             for (int j = 0; j < n; j++) {
35                 //是默认填充则打印#,否则打印其权值
36                 edjes[i][j] == INT_MAX ? std::cout << "#   " : std::cout << edjes[i][j] << "   ";
37             }
38             std::cout << "\n";
39         }
40     }
41 };
42 Graph* Graph::createGraph()
43 {
44     std::cout << "图的信息:\n顶点数:" << n << "  边数:" << e<<"  类型:";
45     switch (type) {
46     case UG:std::cout << "无向图\n"; break;
47     case DG:std::cout << "有向图\n"; break;
48     case UN:std::cout << "无向网\n"; break;
49     case DN:std::cout << "有向网\n"; break;
50     }
51     //根据顶点数来构造矩阵, 无边填充INT_MAX
52     for (int i = 0; i < n; i++) {
53         vector<int> temp(n, INT_MAX);
54         edjes.emplace_back(temp);
55     }
56     //填充顶点数组,确立顶点名字和下标的映射
57     for (int i = 0; i < n; i++) {
58         string name;
59         std::cout << "输入第" << i + 1 << "个顶点的名字(string):";
60         std::cin >> name;
61         vertex2index[name] = i;
62     }
63     //输入边的信息
64     for (int i = 0; i < e; i++) {
65         string n1, n2;
66         int pow = 1, row = 0, column = 0;
67         std::cout << "输入第" << i + 1;
68         if (type == UG || type == DG) {                            //UG或DG没有权值,默认显示为1
69             std::cout << "条边的弧头,弧尾:\n";
70             std::cin >> n1 >> n2;
71         }
72         else {
73             std::cout <<"条边的弧头,弧尾,权值:\n";                //UN或DN有权值
74             std::cin >> n1 >> n2 >> pow;
75         }
76         row = vertex2index[n1]; column = vertex2index[n2];        //根据边的名字找到对应下标
77         edjes[row][column] = pow;
78         type == UG || type == UN ?edjes[column][row] = pow : 1;   //如果是UG或UN则对角线对称
79     }
80     
81     return this;
82 }
83 int main()
84 {
85     //示例:6节点10边有向网
86     Graph *g = new Graph(6,10,DN);
87     g->createGraph();
88     g->showGraph();
89     std::cin.get();
90 }

 

相关文章: