- 有N个人,每个人均有明确的选择权,可与不超过N-1个人拉手,规则是左手拉右手。请问,组成一个最大的拉手圈的算法。(需要注意的是,某人M其左右手可能的拉手权利不是N-1,可能只有2个、3个等等。总之,有人某只手有N-1次机会,有人没有;或者均有等等)
组建最大拉手圈的算法
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 组成最大拉手圈的问题可以使用图论的概念来解决。因为一个人可以和不超过N-1个人拉手,所以我们可以建立一个图,其中每个人都是一个顶点,每一组拉手关系都是图中一条边。然后,我们需要构造一个在图上的环,使得每个顶点都有且仅有一条入边和一条出边。这个环的大小就是最大的拉手圈的人数。
以下是C++代码的实现:
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 110; int n, m; vector<int> g[N]; bool st[N]; bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!st[v]) { st[v] = true; if (dfs(v)) { g[v].push_back(u); return true; } } } return false; } int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; g[a].push_back(b); } int res = 0; for (int i = 1; i <= n; i++) { fill(st + 1, st + n + 1, false); if (dfs(i)) res++; } cout << res << endl; return 0; }
代码中的dfs函数用于找到一条增广路,使得每个顶点都有一条入边和一条出边。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 mmocr的训练错误,结果全为0
- ¥15 python的qt5界面
- ¥15 无线电能传输系统MATLAB仿真问题
- ¥50 如何用脚本实现输入法的热键设置
- ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
- ¥30 深度学习,前后端连接
- ¥15 孟德尔随机化结果不一致
- ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
- ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
- ¥15 谁有desed数据集呀