当前位置:   article > 正文

【邻接矩阵】64 邻接矩阵:顶点u的第一个邻接顶点_邻接矩阵:顶点u的第一个邻接顶点 时间限制: 1s类别: ds:图->邻接矩阵 问题描述 :

邻接矩阵:顶点u的第一个邻接顶点 时间限制: 1s类别: ds:图->邻接矩阵 问题描述 :

问题描述 :

目的:使用C++模板设计并逐步完善图的邻接矩阵抽象数据类型(ADT)。

内容:

(1)请参照图的邻接矩阵模板类原型,设计并逐步完善图的邻接矩阵ADT。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。)

(2)设计并实现一个算法,在已存在的图中返回G中指定顶点u的第一个邻接顶点的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1。图的存储结构采用邻接矩阵。将其加入到ADT中。

 

函数原型:

int GetFirstAdjVex(int u, int &v); //返回G中指定顶点u的第一个邻接顶点的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1

 

注意:DG(有向图), DN(有向网), UDG(无向图), UDN(无向网)

 

图的邻接矩阵模板类原型参考如下:

 

template <class TypeOfVer, class TypeOfEdge>

class adjmatrix_graph{

    private:

       int Vers;        //顶点数 

       int Edges;       //边数 

       TypeOfEdge **edge;  //存放邻接矩阵(TypeOfEdge表示顶点关系类型。对于无权图,用1或0,表示相邻否;对于带权图,则为权值类型) 

       TypeOfVer *ver;    //存放结点值 

       TypeOfEdge noEdge;  //邻接矩阵中的∞的表示值

       string GraphKind;   //图的种类标志 

        

       bool DFS(int u, int &num, int visited[]); //DFS遍历(递归部分)

 

    public:

       adjmatrix_graph( const string &kd, int vSize, const TypeOfVer d[], const TypeOfEdge noEdgeFlag); //构造函数构造一个只有结点没有边的图。4个参数的含义:图的类型、结点数、结点值和邻接矩阵中表示结点间没有边的标记(无权图:0,有权图:输入参数定) 

       adjmatrix_graph( const string &kd, int vSize, int eSize, const TypeOfVer d[], int **e); //构造函数构造一个无权图。5个参数的含义:图的类型、结点数、边数、结点集和边集 

       adjmatrix_graph( const string &kd, int vSize, int eSize, const TypeOfEdge noEdgeFlag, const TypeOfVer d[], int **e, const TypeOfEdge w[]); //构造函数构造一个有权图。7个参数的含义:图的类型、结点数、边数、无边标记、结点集、边集、权集

       bool GraphisEmpty() { return Vers == 0; }  //判断图空否

       string GetGraphKind(){ return GraphKind; }

       bool GetVer(int u, TypeOfVer &data); //取得G中指定顶点的值 

       int GetFirstAdjVex(int u, int &v); //返回G中指定顶点u的第一个邻接顶点的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1 

       int GetNextAdjVex(int u, int v, int &w); //返回G中指定顶点u的下一个邻接顶点(相对于v)的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1

       bool PutVer(int u, TypeOfVer data); //对G中指定顶点赋值 

       bool InsertVer(const TypeOfVer &data); //往G中添加一个顶点 

       int LocateVer(TypeOfVer data); //返回G中指定顶点的位置 

       bool PrintMatrix();  //输出邻接矩阵 

       int GetVerNum(){ return Vers;}    //取得当前顶点数 

       int GetEdgeNum(){ return Edges;}  //取得当前边数 

       bool Insert_Edge(int u, int v); //无权图插入一条边

       bool Insert_Edge(int u, int v, TypeOfEdge w); //有权图插入一条边

       bool DeleteVer(const TypeOfVer &data); //往G中删除一个顶点

       bool Delete_Edge(int u, int v); //无权图删除一条边 

       bool Delete_Edge(int u, int v, TypeOfEdge w); //有权图删除一条边 

       void DFS_Traverse(int u); //DFS遍历(外壳部分)

       void BFS_Traverse(int u); //BFS遍历

       ~adjmatrix_graph(); //析构函数 

};

 

输入说明 :

建图的输入数据格式参见建图的算法说明。

 

第一行:图的类型

第二行:结点数

第三行:结点集

第四行:边数

第五行:边集

第六行:指定顶点的位序

 

输出说明 :

第一行:顶点集

空行

第二行:邻接矩阵

空行

第三行:第一个邻接顶点的位序(如无邻接顶点,则输出-1)

输入范例 :

DG
6
A B C D E F
6
0 1
0 2
0 3
1 4
2 4
3 5
0

输出范例 :

A B C D E F

0 1 1 1 0 0 
0 0 0 0 1 0 
0 0 0 0 1 0 
0 0 0 0 0 1 
0 0 0 0 0 0 
0 0 0 0 0 0 

1

解题思路:

解题代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <queue>
  10. #include <sstream>
  11. #include <stack>
  12. #include <map>
  13. #include <ctime>
  14. #include <array>
  15. #include <set>
  16. using namespace std;
  17. template <class TypeOfVer, class TypeOfEdge>//节点数值,边数值
  18. class adjmatrix_graph {
  19. private:
  20. int Vers; //顶点(节点)数
  21. int Edges; //边数
  22. //存放邻接矩阵(TypeOfEdge表示顶点关系类型。对于无权图,用1或0,表示相邻否;对于带权图,则为权值类型)
  23. vector<vector<TypeOfEdge> >edge;//邻接矩阵
  24. TypeOfEdge noEdge; //邻接矩阵中的∞的表示值
  25. vector<TypeOfVer> ver; //存放结点值
  26. string GraphKind; //图的种类标志
  27. bool have_dir = false, have_w = false;//图类型参数
  28. //bool DFS(int u, int& num, int visited[]); //DFS遍历(递归部分)
  29. public:
  30. adjmatrix_graph()
  31. {
  32. Vers = 0;
  33. Edges = 0;
  34. edge.clear();
  35. ver.clear();
  36. noEdge = 0;
  37. }
  38. ~adjmatrix_graph()
  39. {
  40. ;
  41. }
  42. //全自动输入
  43. bool Auto_input(bool need_emp)
  44. {
  45. //DG(有向图), DN(有向网), UDG(无向图), UDN(无向网)
  46. /*第一行:图的类型 DN UDN
  47. 第二行:结点数
  48. 第三行:结点集
  49. 第四行:无边标记
  50. 第五行:边数
  51. 第六行:边集
  52. 第七行:权集*/
  53. /*第一行:图的类型 DG UDG
  54. 第二行:结点数
  55. 第三行:结点集
  56. 第四行:边数
  57. 第五行:边集*/
  58. cin >> GraphKind;//图的类型
  59. cin >> Vers;//结点数
  60. ver.resize(Vers);
  61. for (int i = 0; i < Vers; i++)//结点集
  62. cin >> ver[i];
  63. if (need_emp)
  64. cin >> noEdge;//无边标记
  65. vector<TypeOfEdge> line;//邻接矩阵初始化
  66. for (int j = 0; j < Vers; j++)
  67. {
  68. for (int i = 0; i < Vers; i++)
  69. line.push_back(noEdge);
  70. edge.push_back(line);
  71. }
  72. cin >> Edges;//边数
  73. vector<int> x_p, y_p, w_p;
  74. for (int i = 0; i < Edges; i++)
  75. {
  76. int c_x, c_y;
  77. cin >> c_x >> c_y;
  78. x_p.push_back(c_x);
  79. y_p.push_back(c_y);
  80. }
  81. //图的类型识别
  82. if (GraphKind == "DG")//DG(有向图)
  83. have_dir = true, have_w = false;
  84. if (GraphKind == "DN")//DN(有向网)
  85. have_dir = true, have_w = true;
  86. if (GraphKind == "UDG")//UDG(无向图)
  87. have_dir = false, have_w = false;
  88. if (GraphKind == "UDN")//UDN(无向网)
  89. have_dir = false, have_w = true;
  90. if(have_w)
  91. for (int i = 0; i < Edges; i++)
  92. {
  93. int c_w;
  94. cin >> c_w;
  95. w_p.push_back(c_w);
  96. }
  97. for (int i = 0; i < Edges; i++)
  98. {
  99. if (have_dir == false)//无向图操作
  100. {
  101. if (have_w == true)//带权值的网的操作
  102. edge[x_p[i]][y_p[i]] = edge[y_p[i]][x_p[i]] = w_p[i];
  103. else//无权值操作
  104. edge[x_p[i]][y_p[i]] = edge[y_p[i]][x_p[i]] = 1;
  105. }
  106. else
  107. {
  108. if (have_w == true)//带权值的网的操作
  109. edge[x_p[i]][y_p[i]] = w_p[i];
  110. else//无权值操作
  111. edge[x_p[i]][y_p[i]] = 1;
  112. }
  113. }
  114. return 1;
  115. }
  116. //输出邻接矩阵
  117. bool PrintMatrix()
  118. {
  119. int i, j;
  120. for (i = 0; i < Vers; i++)
  121. {
  122. for (j = 0; j < Vers-1; j++)
  123. cout << edge[i][j] << " ";
  124. cout << edge[i][j]<<" ";
  125. cout << endl;
  126. }
  127. return 1;
  128. }
  129. //判断图空否
  130. bool GraphisEmpty(void)
  131. {
  132. return Vers == 0;
  133. }
  134. //图的类型
  135. string GetGraphKind(void)
  136. {
  137. return GraphKind;
  138. }
  139. //获得顶点集
  140. vector<TypeOfVer> GetGraph_Point(void)
  141. {
  142. return ver;
  143. }
  144. //往G中添加一个顶点
  145. bool InsertVer(const TypeOfVer& data)
  146. {
  147. ver.push_back(data);
  148. vector<TypeOfEdge> line;//邻接矩阵一行
  149. for (int j = 0; j < Vers; j++)
  150. {
  151. edge[j].push_back(noEdge);
  152. }
  153. for (int j = 0; j <= Vers; j++)
  154. {
  155. line.push_back(noEdge);
  156. }
  157. edge.push_back(line);
  158. Vers++;
  159. return 1;
  160. }
  161. //返回G中指定顶点的位置
  162. int LocateVer(TypeOfVer data)
  163. {
  164. int i = 0;
  165. for (i = 0; i < ver.size(); i++)
  166. if (ver[i] == data)
  167. return i;
  168. return -1;
  169. }
  170. //删除一个顶点
  171. bool Delete_Point(const TypeOfVer& data)
  172. {
  173. int i, j;
  174. for (i = 0; i < Vers; i++)
  175. if (ver[i] == data)
  176. {
  177. ver.erase(ver.begin() + i);
  178. break;
  179. }
  180. if (i == Vers)//没有找到
  181. return 0;
  182. Vers--;
  183. edge.erase(edge.begin() + i);
  184. for (j = 0; j < Vers; j++)
  185. edge[j].erase(edge[j].begin() + i);
  186. return 1;
  187. }
  188. //取得当前边数
  189. int GetEdgeNum(void)
  190. {
  191. return Edges;
  192. }
  193. //取得当前顶点数
  194. int GetVerNum()
  195. {
  196. return Vers;
  197. }
  198. //图删除一条边
  199. bool Delete_Edge(int u, int v)
  200. {
  201. if (have_dir == true)
  202. if (edge[u][v] != noEdge)
  203. {
  204. edge[u][v] = noEdge;
  205. Edges--;
  206. return true;
  207. }
  208. else
  209. return false;
  210. else
  211. {
  212. if (edge[u][v] != noEdge && edge[v][u] != noEdge)
  213. {
  214. edge[u][v] = noEdge;
  215. edge[v][u] = noEdge;
  216. Edges--;
  217. return true;
  218. }
  219. else
  220. return false;
  221. }
  222. return false;
  223. }
  224. //取得G中指定顶点的入度
  225. int search_PointIn(int p)
  226. {
  227. if (have_dir == false)//无向图无入度
  228. return -1;
  229. if (p < 0 || p >= Vers)
  230. return -1;
  231. int i,ans=0;
  232. for (i = 0; i < Vers; i++)
  233. if (edge[i][p] != noEdge)
  234. ans++;
  235. return ans;
  236. }
  237. int search_PointOut(int p)//取得G中指定顶点的出度
  238. {
  239. if (p < 0 || p >= Vers)
  240. return -1;
  241. int i, ans = 0;
  242. for (i = 0; i < Vers; i++)
  243. if (edge[p][i] != noEdge)
  244. ans++;
  245. return ans;
  246. }
  247. bool Look_adjacent(int u, int v)
  248. {
  249. if (u < 0 || u >= Vers)
  250. return false;
  251. if (v < 0 || v >= Vers)
  252. return false;
  253. if (u == v)
  254. return false;
  255. if (edge[u][v] != noEdge)
  256. return true;
  257. else
  258. return false;
  259. }
  260. int Look_firstPoint(int p)//获取第一个临界顶点位序
  261. {
  262. if (p < 0 || p >= Vers)
  263. return -1;
  264. for (int i = 0; i < Vers; i++)
  265. if (edge[p][i] != noEdge)
  266. return i;
  267. return -1;
  268. }
  269. //+++++++++++++++++++======分割线=====+++++++++++++++++++++++++++++
  270. //返回G中指定顶点u的第一个邻接顶点的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1
  271. int GetFirstAdjVex(int u, int& v)
  272. {
  273. int p;
  274. return p;
  275. }
  276. //返回G中指定顶点u的下一个邻接顶点(相对于v)的位序(顶点集)。若顶点在G中没有邻接顶点,则返回-1
  277. int GetNextAdjVex(int u, int v, int& w)
  278. {
  279. return -1;
  280. }
  281. //对G中指定顶点赋值
  282. bool PutVer(int u, TypeOfVer data)
  283. {
  284. return 1;
  285. }
  286. //无权图插入一条边
  287. bool Insert_Edge(int u, int v)
  288. {
  289. return 1;
  290. }
  291. //有权图插入一条边
  292. bool Insert_Edge(int u, int v, TypeOfEdge w)
  293. {
  294. return 1;
  295. }
  296. //void DFS_Traverse(int u); //DFS遍历(外壳部分)
  297. //void BFS_Traverse(int u); //BFS遍历
  298. };
  299. int main()
  300. {
  301. int i;
  302. adjmatrix_graph<char, int> a;
  303. a.Auto_input(0);
  304. int p;
  305. cin >> p;
  306. //cout << a.GetGraphKind() << endl;//输出类型
  307. //输出顶点集----------------------
  308. vector<char> ans;
  309. ans = a.GetGraph_Point();
  310. for (i = 0; i < ans.size() - 1; i++)
  311. cout << ans[i] << " ";
  312. cout << ans[i] << endl;
  313. //-------------------------------
  314. cout << endl;
  315. a.PrintMatrix();
  316. cout << endl;
  317. cout << a.Look_firstPoint(p) << endl;
  318. return 0;
  319. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/934831
推荐阅读
相关标签
  

闽ICP备14008679号