PAT A 1013. Battle Over Cities (25)【并查集】
2016-11-17 16:12
369 查看
https://www.patest.cn/contests/pat-a-practise/1013
思路:并查集合并
#include<set> #include<map> #include<queue> #include<algorithm> #include<string> #include<string.h> using namespace std; int n;//number of city int m;//number of edge int k;//number of query typedef struct Edge { int v; Edge(int _v) :v(_v){}; }Edge; typedef struct Node { int parent; }Node; vector<Node> city; void InitSet() { city.resize(n); for (int i = 0; i < n; i++) city[i].parent = i;//独立离散连通域 } int FindSet(int x) { if (city[x].parent != x) { int top = FindSet(city[x].parent); city[x].parent = top; } return city[x].parent; } void UnionSet(int x, int y) { int a = FindSet(x); int b = FindSet(y); if (a != b)city[a].parent = b; } int main() { scanf("%d%d%d", &n, &m, &k); vector<vector<Edge>> edge; edge.resize(n); for (int i = 0; i < m;i++) { int a, b; scanf("%d%d", &a, &b); a--, b--; edge[a].push_back(Edge(b)); edge[b].push_back(Edge(a)); } for (int i = 0; i < k; i++) { int q; scanf("%d", &q); q--; InitSet(); for (int u = 0; u < n; u++) { for (int j = 0; j < edge[u].size(); j++) { int v = edge[u][j].v; if (u != q&&v != q)UnionSet(u, v); } } set<int> parentSet; for (int j = 0; j < n; ++j) //must be care for this, for consistency we must get the root via FindSet function instead of city[j].parent parentSet.insert(FindSet(j)); printf("%d\n", parentSet.size() - 2); } return 0; }
相关文章推荐
- PAT A 1118. Birds in Forest (25)【并查集】
- 7-22 朋友圈(25 分) (并查集)
- PAT A 1016. Phone Bills (25)【模拟】
- 1021. Deepest Root (25) -并查集判树 -BFS求深度
- PAT A 1003. Emergency (25)
- PAT A 1024. Palindromic Number (25)
- PAT A 1093. Count PAT's (25)
- PAT A 1098. Insertion or Heap Sort (25)
- PAT A 1012. The Best Rank (25)
- PAT A 1032. Sharing (25)
- PAT A 1033. To Fill or Not to Fill (25)
- PAT A 1051. Pop Sequence (25)
- PAT A1109. Group Photo (25)
- PAT A1102 invert a binary tree (25)
- PAT A1122 hamiltonian cycle (25)
- 1118. Birds in Forest (25)-PAT甲级真题(并查集)
- PAT A1012. The Best Rank (25)
- PAT A 1052. Linked List Sorting (25)
- PAT A 1062. Talent and Virtue (25)
- PAT A 1002. A+B for Polynomials (25)