当前位置:   article > 正文

图的基本应用:社交网络图中结点的“重要性”计算

图的基本应用:社交网络图中结点的“重要性”计算

题目描述:

输入:

输出:

样例:

输入:                                                            输出:

9 14                                                                Cc(3)=0.47
1 2                                                                  Cc(4)=0.62
1 3                                                                  Cc(9)=0.35
1 4
2 3
3 4
4 5
4 6
5 6
5 7
5 8
6 7
6 8
7 8
7 9
3 3 4 9

解题思路:(本题思路完全根据自己上课所学所打,如有更好解法可以评论区交流)

本题采用的是邻接矩阵的方法来实现的(当然用邻接表定义一个类可能更加简单一点,但懒得改了bushi)

我们先利用邻接矩阵的方法构建一个图,由于要找最短路径,这里用到的是广度优先遍历算法即bfs,这样能确保我们一定能找到最短路径;BFS这里不细说怎么实现,原理就是利用队列的数据结构,但值得注意的是我们要找最短路径,则要标记是否访问过,否则存在环路会是结果发生错误甚至产生异常,所以我们给结构体中加了一个visited的标志位,除此之外,记得每次进行BFS之前都要对标志位进行初始化(即文中的initialfalse);

那我们怎么计算距离呢,找到结点之后?我们给每个结构体都定义了一个parent变量方便回溯,这样,并将全部初始化为-1,如果回溯到某个结点parent为-1,则结束,得到距离;注意这里每BFS也都要初始化parent(即文中的initialparent);

最后要注意的是可能出现非连通图,所以每次进来先判断是不是连通图,如果不是直接退出并输出0.00,同理在判断每个节点与其他点的距离的时候也可以先判断两者之间是否路径,没有则为非连通图,直接距离为0,进行下一步循环;

  1. #include<iostream>
  2. #include<queue>
  3. #include<iomanip>
  4. using namespace std;
  5. struct VexNode {
  6. int data;
  7. int* ArcList;
  8. int Nodenum;
  9. bool visited;
  10. int parent;
  11. };
  12. void initialfalse(VexNode* v) {
  13. for (int i = 0; i < v[0].Nodenum; i++)
  14. v[i].visited = false;
  15. }
  16. void initialparent(VexNode* v) {
  17. for (int i = 0; i < v[0].Nodenum; i++)
  18. v[i].parent = -1;
  19. }
  20. VexNode* CreateGraph() {
  21. int nodenum, i, j, arcnum;
  22. cin >> nodenum>>arcnum;
  23. VexNode* v = new VexNode[nodenum];
  24. for (i = 0; i <nodenum; i++) {
  25. v[i].data=i;
  26. v[i].Nodenum = nodenum;
  27. v[i].parent = -1;
  28. v[i].ArcList = new int[nodenum];
  29. for (j = 0; j < nodenum; j++)
  30. v[i].ArcList[j] = 0;
  31. }
  32. int x, y;
  33. for (i = 0; i < arcnum; i++) {
  34. cin >> x >> y;
  35. v[x - 1].ArcList[y-1] = 1;
  36. v[y - 1].ArcList[x-1] = 1;
  37. }
  38. return v;
  39. }
  40. bool judge(VexNode* v, int index) {
  41. bool flag = false;
  42. for (int i = 0; i < v[0].Nodenum; i++) {
  43. if (v[index].ArcList[i] != 0)
  44. flag = true;
  45. }
  46. return flag;
  47. }
  48. void BFS(VexNode* v, int index,int i) {
  49. queue<int>q;
  50. q.push(index);
  51. v[index].visited = true;
  52. while (!q.empty()) {
  53. int top = q.front();
  54. q.pop();
  55. int k = 0;
  56. while (k < v[0].Nodenum) {
  57. if (v[top].ArcList[k]==1) {
  58. if (k == i) {
  59. v[k].parent = top;
  60. return;
  61. }
  62. if (v[k].visited == false) {
  63. v[k].visited=true;
  64. q.push(k);
  65. v[k].parent = top;
  66. //cout << v[k].data << ' ';
  67. }
  68. }
  69. k++;
  70. }
  71. }
  72. }
  73. int calcDepth(VexNode* v, int i) {
  74. int k = i,depth=0;
  75. while (v[k].parent != -1) {
  76. k = v[k].parent;
  77. depth++;
  78. }
  79. return depth;
  80. }
  81. void BFSTraverse(VexNode* v,int index) {
  82. if (!judge(v, index - 1)) {
  83. cout << "0.00" << endl;
  84. return;
  85. }
  86. int i,k=0;
  87. int distance[1000];
  88. for (i = 0; i < v[0].Nodenum; i++) {
  89. if (i == index - 1)
  90. continue;
  91. initialfalse(v);
  92. if (judge(v, i)) {
  93. BFS(v, index - 1, i);
  94. distance[k] = calcDepth(v, i);
  95. initialparent(v);
  96. }
  97. else
  98. distance[k] = 0;
  99. k++;
  100. }
  101. double result = 0;
  102. for (i = 0; i < v[0].Nodenum-1; i++) {
  103. result += distance[i];
  104. }
  105. result /= (v[0].Nodenum - 1);
  106. cout << "Cc(" << index << ")=" <<fixed<< setprecision(2) << 1.0/result << endl;
  107. }
  108. int main()
  109. {
  110. VexNode* v = CreateGraph();
  111. int n,i,index;
  112. cin >> n;
  113. for (i = 0; i < n; i++) {
  114. cin >> index;
  115. BFSTraverse(v, index);
  116. }
  117. return 0;
  118. }

以上即为本题的全部内容,可能存在一些可以改进的地方和不足的地方,欢迎大家评论相互交流,感谢观看!

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

闽ICP备14008679号