题目大意
给定一张图,判断其是否为一条链(例如二叉搜索树的最劣情况)、一个环、菊花图(SPFA 算法最怕的图)。
分析
观察三种图的点与边的关系,可以发现以下结论:
- 对于一条连,只有两个点是连着一条边的,其余的点都是连着两条边的。
- 对于环,所有的点都连着两条边。
- 对于菊花图,只有一个点连着 n−1 个边,其余的点都连着一条边。
于是想到使用桶记录每个点连的边数,再 O(1) 判断。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<bits/stdc++.h> using namespace std; int n, m; int cnt[100000 + 10], edge[100000 + 10]; int main() { cin >> n >> m; for (int i = -m + 1, tmp; i <= m; ++i) { cin >> tmp; edge[tmp]++; } for (int i = 1; i <= n; ++i) cnt[edge[i]]++; if (cnt[2] == n - 2 && cnt[1] == 2) cout << "bus topology" << endl; else if (cnt[2] == n) cout << "ring topology" << endl; else if (cnt[n - 1] == 1 && cnt[1] == n - 1) cout << "star topology" << endl; else cout << "unknown topology" << endl; return 0; }
|