1 条题解
-
0
解题思路
- 可以将昆虫看作图中的节点,昆虫之间的互动看作边。要判断是否存在同性互动,即判断这个图是否是二分图。
- 二分图的判定可以使用染色法。对图中的节点进行染色,使得相邻节点颜色不同。如果在染色过程中出现相邻节点颜色相同的情况,那么这个图就不是二分图,也就说明存在同性互动。 实现步骤
- 初始化:创建一个数据结构来存储图的信息,比如邻接表,同时创建一个数组来记录每个节点的染色情况。
- 构建图:根据输入的昆虫互动信息,构建图的邻接表。
- 染色判断:从每个未染色的节点开始进行染色,使用深度优先搜索或广度优先搜索遍历图。在染色过程中,检查相邻节点的颜色是否与当前节点相同,如果相同则说明不是二分图。
- 输出结果:根据染色判断的结果,输出相应的信息。 代码:
#include <iostream> #include <vector> #include <cstring> using namespace std; const int N = 2010; vector<int> g[N]; int color[N]; // 深度优先搜索染色函数 bool dfs(int u, int c) { color[u] = c; for (int v : g[u]) { if (!color[v]) { if (!dfs(v, 3 - c)) { return false; } } else if (color[v] == c) { return false; } } return true; } void solve() { int n, m; cin >> n >> m; // 初始化图和染色数组 for (int i = 1; i <= n; i++) { g[i].clear(); color[i] = 0; } // 构建图 for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } // 染色判断 bool flag = true; for (int i = 1; i <= n; i++) { if (!color[i]) { if (!dfs(i, 1)) { flag = false; break; } } } // 输出结果 if (flag) { cout << "No suspicious bugs found!" << endl; } else { cout << "Suspicious bugs found!" << endl; } } int main() { int t; cin >> t; for (int i = 1; i <= t; i++) { cout << "Scenario #" << i << ":" << endl; solve(); cout << endl; } return 0; }
- 1
信息
- ID
- 1493
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者