prestige

Untitled

Apr 15th, 2013
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <vector>
  4. using namespace std;
  5. int n, m, q;
  6. int kab_sz = 0;
  7. pair<int, int> kab[100000];
  8. int parent[1001];
  9. int sz[1001];
  10. int myset[501];
  11. void make_set (int v) {
  12. parent[v] = v;
  13. sz[v] = 1;
  14. }
  15.  
  16. int find_set (int v) {
  17. if (v == parent[v])
  18. return v;
  19. return parent[v] = find_set (parent[v]);
  20. }
  21.  
  22. void union_sets (int a, int b) {
  23. a = find_set (a);
  24. b = find_set (b);
  25. if (a != b) {
  26. if (sz[a] < sz[b])
  27. swap (a, b);
  28. parent[b] = a;
  29. sz[a] += sz[b];
  30. }
  31. }
  32. void rebuild (int a, int b) {
  33. for (int i = 0; i < n; i++) {
  34. parent[i] = i;
  35. sz[i] = 1;
  36. }
  37. for (int i = 0; i < kab_sz; i++) {
  38. if (a <= i && i <= b) {
  39. continue;
  40. } else {
  41. union_sets(kab[i].first, kab[i].second);
  42. }
  43. }
  44. }
  45. int main () {
  46. scanf ("%d%d", &n, &m);
  47. for (int i = 0; i < m; i++) {
  48. int t1, t2;
  49. scanf ("%d%d", &t1, &t2);
  50. t1--, t2--;
  51. kab[kab_sz++] = make_pair(t1, t2);
  52. }
  53. scanf ("%d", &q);
  54. for (int i = 0; i < q; i++) {
  55. int t1, t2;
  56. set<int> ans;
  57. scanf ("%d%d", &t1, &t2);
  58. t1--, t2--;
  59. rebuild(t1, t2);
  60. for (int j = 0; j < n; j++) {
  61. myset[find_set(j)]++;
  62. }
  63. int cc = 0;
  64. for (int j = 0; j < n; j++) {
  65. if (myset[j]) {
  66. cc++;
  67. myset[j] = 0;
  68. }
  69. }
  70. printf("%d\n", cc);
  71. }
  72. return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment