当前位置:   article > 正文

【PTA】L3-01 六度空间_pta六度空间c

pta六度空间c

方法1:弗洛伊德算法

  1. #include<iostream>
  2. #include<iomanip>//c++用于格式化输出
  3. #include<climits>
  4. using namespace std;
  5. int main() {
  6. int n, e;//顶点和边
  7. cin >> n >> e;
  8. //动态生成一个二维数组来保存图的边之间的信息
  9. //因为图的顶点一般是从1开始的,而数组是默认从0开始,所以需要定义n+1个空间
  10. int** G = new int* [n + 1];//动态定义二维数组的行
  11. for (int i = 0; i <= n; i++) {
  12. G[i] = new int[n + 1] {0};//动态定义二维数组的列,并初始化所有值为0
  13. }
  14. for (int i = 1; i <= n; i++) {
  15. for (int j = 1; j <= n; j++) {
  16. if (i != j)G[i][j] = INT_MAX;//除了左对角线以外都先赋值为无穷大(这里采用int类型的最大值)
  17. }
  18. }
  19. //输入关联的边
  20. for (int i = 1; i <= e; i++) {
  21. int v1, v2;
  22. cin >> v1 >> v2;
  23. G[v1][v2] = G[v2][v1] = 1;//无向图有双向边
  24. }
  25. //弗洛伊德算法:路径最短算法
  26. for (int k = 1; k <= n; k++) {
  27. for (int i = 1; i <= n; i++) {
  28. for (int j = 1; j <= n; j++) {
  29. if (G[i][k] != INT_MAX && G[k][j] != INT_MAX) {//防止两个数相加超过int的范围
  30. if (G[i][k] + G[k][j] < G[i][j]) {//找到了更小的路径
  31. G[i][j] = G[i][k] + G[k][j];//更新图的最小路径
  32. }
  33. }
  34. }
  35. }
  36. }
  37. //输出
  38. for (int i = 1; i <= n; i++) {
  39. int cnt = 0;
  40. for (int j = 1; j <= n; j++) {
  41. if (G[i][j] <= 6)cnt++;
  42. }
  43. //c++的格式化函数setprecision(x),表示保留x为小数
  44. cout << i << fixed << setprecision(2) << ": " << 100.0 * cnt/n<<"%"<< endl;
  45. }
  46. //释放开辟的空间
  47. for (int i = 0; i <= n; i++) {
  48. if (G[i] != NULL) {
  49. delete[] G[i];
  50. G[i] = NULL;
  51. }
  52. }
  53. delete[] G;
  54. G = NULL;
  55. }

方法2:图的广度优先遍历

  1. #include<iostream>
  2. #include<iomanip>//c++的格式化输出函数库
  3. #include<queue>
  4. using namespace std;
  5. int n, e;//顶点和边
  6. //图的广度优先遍历函数:返回值是满足六度空间的边的个数
  7. int BFS(int v,int** G) {
  8. bool *visited = new bool[n + 1] {0};//记录顶点的遍历情况(0未遍历 1遍历过)
  9. queue<int>q;//定义一个队列
  10. q.push(v);
  11. visited[v] = true;
  12. //cnt记录满足6度空间边的个数,tail用于保存队列中的最后一个元素
  13. int cnt = 1, last = v, tail = v,level=1;//last保存的是队列中的第一个元素
  14. while (q.size()) {//队列不为空时进入循环
  15. int item = q.front();
  16. q.pop();
  17. for (int i = 1; i <= n; i++) {//遍历队列中第一个元素的每个关联的边
  18. if (G[i][item] && !visited[i]) {
  19. visited[i] = true;
  20. q.push(i);//将满足条件的顶点加入队列
  21. cnt++;//满足条件的边
  22. tail = i;//更新当前正在队列中的最后一个元素
  23. }
  24. }
  25. if (item == last) {//判断是否是本层最后一个节点
  26. last = tail;
  27. level++;
  28. }
  29. if (level > 6)break;
  30. }
  31. delete[]visited;//释放开辟的空间
  32. return cnt;
  33. }
  34. //六度空间输出函数
  35. void SDS(int** G) {
  36. for (int i = 1; i <= n; i++) {
  37. int cnt = BFS(i, G);
  38. //setprecision(x),输出小数点后x位
  39. cout << i << fixed << setprecision(2) << ": " << 100.0 * cnt / n << "%" << endl;
  40. }
  41. }
  42. int main() {
  43. cin >> n >> e;
  44. int** G = new int* [n + 1];//定义二维数组的行
  45. for (int i = 0; i <= n; i++)
  46. G[i] = new int[n + 1] {0};//定义二维数组的列并赋值为0
  47. //输入边之间的关联
  48. for (int i = 1; i <= e; i++) {
  49. int v1, v2;
  50. cin >> v1 >> v2;
  51. G[v1][v2] = G[v2][v1] = 1;//无向图有双向边
  52. }
  53. //调用函数
  54. SDS(G);
  55. //释放动态开辟的空间
  56. for (int i = 0; i <= n; i++) {
  57. if (G[i] != NULL) {
  58. delete[]G[i];
  59. G[i] = NULL;
  60. }
  61. }
  62. delete[] G;
  63. G = NULL;
  64. return 0;
  65. }

参考代码:

7-1 六度空间 (PTA-数据结构)-CSDN博客

PTA 六度空间超详细题解-CSDN博客

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

闽ICP备14008679号