点数 填空题 2021 模拟赛
问题描述
一个无向图包含 2020 条边,如果图中没有自环和重边,请问最少包含多少个结点?
解析:关于无向图 有个公式 最多的边长数 = 点数 * (点数 - 1)/ 2
设点数为n,最多的边长数为 m 时 公式为m = n * (n - 1) / 2
是因为一个点 可以与其他点(n - 1)相连 所以每个点都有 n - 1 条边
n * ( n - 1)就出来了。
因为是边无向的,所以A点 到B点的线 与 B点到A点的线是一样的
一条线会重复计算为两条线 所以需要 /2
另一种思路
1个点时 :0 条边
2个点时 :1 条边(A B 两点连成一条线)
3个点时 :1 + 2 条边(第三个点C 分别连接 A B 就有两条线 加上原先的一条)
4个点时:1 + 2 + 3条边
n个点时:1 + 2 + 3 + … + n - 1 条边
这里用等差数列求和公式可以化简为(首项 + 末项) * 项数 除于 2
1 + (n - 1)* (n - 1) / 2 = n * (n - 1) / 2
代码思路 :m = n * (n - 1) / 2 公式变形 2 * m = n * (n - 1)
带入数据 2020 * 2 <= n * ( n - 1) 如果点数可以连接的边数大于2020那么就输出
#include<iostream>
using namespace std;
int main()
{
int cnt=0;
//从小到大枚举点数
for(int i=2;i<=1000;i++)
{
//如果点数可以连接的最大边 大于 2020 那么就输出
if(4040<=i*(i-1))
{
cnt=i;
break;
}
}
cout<<cnt; // 65
return 0;
}
本题:点数