当前位置: 首页 > news >正文

浙大数据结构慕课课后题(06-图3 六度空间)

题目要求:

输入格式:

输入第1行给出两个正整数,分别表示社交网络图的结点数N1<N≤103,表示人数)、边数M≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。 

输出格式: 

对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。 

输入样例: 

10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10 

输出样例: 

1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00% 

题解: 

        思路如注释所示,可通过所有测试点。 

#include<bits/stdc++.h>
using namespace std;const int MAX_N = 1005; 
vector<vector<int>> sds;  //二维动态数组 
bool vis[MAX_N];int BFS(int v){int count = 1,level = 0,last = v,tail;queue<int> q;q.push(v);vis[v] = true;while(!q.empty()){int u = q.front();q.pop();for(int w : sds[u]){if(!vis[w]){vis[w] = true;q.push(w); count++;tail = w;		}	} if(u == last){level++; last = tail;}if(level == 6) break;}return count;
}int main(){int N,M;cin>>N>>M;sds.resize(N+1);           //动态设置sds数组的大小 fill(vis,vis + N + 1,false);   //初始化vis数组 for(int i = 0; i < M; i++){int u,v;cin>>u>>v;sds[u].push_back(v);sds[v].push_back(u);}	for(int i = 1; i <= N; i++){int count = BFS(i);	      //BFS函数的返回值即为符合要求的结点数目 double ans = 100.0*count/N;printf("%d: %.2f%%\n", i, ans);		fill(vis,vis+N+1,false);    //初始化vis数组 }return 0;
}

总结: 

1. vector二维数组的声名格式有两种:假设数组名为sds。

(1)如果我们提前知道了数组的大小可以这样定义:

MAX_N=1005;

vector<int> sds[MAX_N];

(2)如果不知道数组大小,又需要全局声名就要在main函数外这样定义: 

vector<vector<int>> sds;

然后在main函数里面这样确定数组大小:

int main(){

...

cin>>N;

sds.resize(N);        //resize()函数

...

}

2.在取百分号时,乘数100要写成100.0  虽然在代码中 用了一个double类型的数据来接收计算结果,但是如果写的是(*100)那么编译器会先进行整数乘法,再用浮点数来存取,精度已经损失了,测试点中有两个例子卡的就是这个地方(别问我怎么知道的@_@)。

3.此题的思路比较巧妙,用一个last变量来存储一层的最后一个元素,如果这个元素被弹出,则说明这一层已经遍历完成,从而实现对层数的控制,当层数>=6时,函数终止。

4.题目内容说完了,下面是关于dev编译器,我用的是比较老的devc++,因为看重了它的简洁,但是如果要用到一些c++11的特性,比如本题中的foreach循环会报错,要在这个地方设置一下。

找到编译器选项,加入红框里的语句即可。

 

 

http://www.lryc.cn/news/423478.html

相关文章:

  • Windows File Recovery卡在99%怎么解决?实用指南!
  • 数据结构之数组
  • springboot集成sensitive-word实现敏感词过滤
  • C++ 之动手写 Reactor 服务器模型(一):网络编程基础复习总结
  • qt 在vs2022 报错记录
  • 【人工智能】TensorFlow和机器学习概述
  • SQLALchemy 的介绍
  • Java虚拟机:运行时内存结构
  • 微信小程序子组件调用父组件的方法
  • 【数据结构】TreeMap和TreeSet
  • 前端react集成OIDC
  • JavaWeb—XML_Tomcat10_HTTP
  • 中介者模式在Java中的实现:设计模式精解
  • PyQt编程快速上手
  • Docker Swarm管理
  • Python | Leetcode Python题解之第335题路径交叉
  • Ubuntu视频工具
  • HBase snapshot+replication 测试
  • 代码随想录算法训练营第四十一天|图论基础、深度优先搜索理论基础、98. 所有可达路径、797. 所有可能的路径
  • STM32学习笔记09-SPI通信
  • 树------二叉树
  • 如何对加密后的数据进行模糊查询(面试题)
  • 【MYSQL】当前读和快照读
  • C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。
  • Android gradle 构建
  • vulnhub系列:devguru
  • Robot Operating System——高质量图像传输
  • NLP_情感分类_预训练加微调方案
  • 全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典
  • DataWind看板绘制案例