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 }