Advertisement
ryuk2603

Spoj_IsITATree

Nov 18th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. // Spoj: PT07Y - Is it a tree
  2. // https://www.spoj.com/problems/PT07Y/
  3.  
  4. #include<bits/stdc++.h>
  5. #define MAX 20001
  6. using namespace std;
  7.  
  8. vector<int> graph[MAX];
  9. int nodes, edges;
  10. int parent[MAX];
  11. int size[MAX];
  12.  
  13. void make_set(){
  14.     for(int i=0; i<MAX; i++){
  15.         parent[i] = i;
  16.         size[i] = 1;
  17.     }
  18. }
  19.  
  20. int find(int n){
  21.     if(n == parent[n])
  22.         return n;
  23.     return parent[n] = find(parent[n]);
  24. }
  25.  
  26. void Union(int a, int b){
  27.     a = find(a);
  28.     b = find(b);
  29.     if(a != b){
  30.         if(size[a] < size[b])
  31.             swap(a, b);
  32.         parent[b] = a;
  33.         size[a] += size[b];
  34.     }
  35. }
  36.  
  37. bool isTree(){
  38.     for(int u=1; u<=nodes; u++){
  39.         for(int j=0; j<graph[u].size(); j++){
  40.             int v = graph[u][j];
  41.             if(find(u) == find(v)){
  42.                 return false;
  43.                 break;
  44.             } else Union(u, v);
  45.         }
  46.     }
  47.     return true;
  48. }
  49.  
  50. int main()
  51. {
  52.     make_set();
  53.     scanf("%d %d", &nodes, &edges);
  54.     int u, v;
  55.     for(int i=0; i<edges; i++){
  56.         scanf("%d %d", &u, &v);
  57.         graph[u].push_back(v);
  58.         //graph[v].push_back(u); // why directed ??? :/
  59.     }
  60.     if(isTree() == true)
  61.         printf("YES\n");
  62.     else
  63.         printf("NO\n");
  64.    
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement