Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define endl "\n"
  5. vector <vector <int>> g;
  6. vector <int> color;
  7. vector <int> pr;
  8. int Start = -1;
  9. int End = -1;
  10. bool dfs(int v, int p)
  11. {
  12.     color[v] = 1;
  13.     for (auto to : g[v])
  14.     {
  15.         if (to == p)
  16.             continue;
  17.         if (color[to] == 1)
  18.         {
  19.             Start = to;
  20.             End = v;
  21.             return true;
  22.         }
  23.         if (color[to] == 0)
  24.         {
  25.             color[to] = 1;
  26.             pr[to] = v;
  27.             if (dfs(to,v))
  28.                 return true;
  29.         }
  30.     }
  31.     color[v] = 2;
  32.     return false;
  33. }
  34.  
  35. struct SNM
  36. {
  37.     vector<list<int>> ar;
  38.     vector<int> pr;
  39.     SNM(int n)
  40.     {
  41.         ar.resize(n);
  42.         pr.resize(n);
  43.         for(int i = 0; i < n; i++)
  44.         {
  45.             pr[i] = i;
  46.             ar[i].push_back(i);
  47.         }
  48.     }
  49.     void Merge(int a, int b)
  50.     {
  51.         a = pr[a];
  52.         b = pr[b];
  53.         if(ar[b].size() < ar[a].size())
  54.             swap(a,b);
  55.         if(a == b)
  56.             return;
  57.         for(int tmp : ar[a])
  58.         {
  59.             ar[b].push_back(tmp);
  60.             pr[tmp] = b;
  61.         }
  62.     }
  63.     int Get(int i)
  64.     {
  65.         return pr[i];
  66.     }
  67. };
  68.  
  69. int main()
  70. {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(nullptr);
  73.     cout.tie(nullptr);
  74.     int n,m;
  75.     cin>>n>>m;
  76.     g.resize(n);
  77.     color.assign(n,0);
  78.     pr.assign(n,-1);
  79.     for (int i = 0; i < m; i++)
  80.     {
  81.         int x,y;
  82.         cin>>x>>y;
  83.         x--,y--;
  84.         g[x].push_back(y);
  85.         g[y].push_back(x);
  86.     }
  87.     bool fl = false;
  88.     for (int i = 0; i < n && !fl; i++)
  89.     {
  90.         if (color[i] != 0)
  91.             continue;
  92.         fl = dfs(i, -1);
  93.         if (fl)
  94.             break;
  95.     }
  96.     if (!fl)
  97.     {
  98.         cout<<"NO"<<endl;
  99.         return 0;
  100.     }
  101.     vector <int> circle;
  102.     circle.push_back(Start);
  103.     while(Start != End)
  104.     {
  105.         circle.push_back(End);
  106.         End = pr[End];
  107.     }
  108.     for (int i = 0; i < g[Start].size(); i++)
  109.         if (g[Start][i] == End)
  110.         {
  111.             g[Start].erase(g[Start].begin() + i);
  112.             break;
  113.         }
  114.     for (int i = 0; i < g[End].size(); i++)
  115.         if (g[End][i] == Start)
  116.         {
  117.             g[End].erase(g[End].begin() + i);
  118.             break;
  119.         }
  120.     /*for (int i = 1; i < circle.size(); i++)
  121.     {
  122.         g[circle[i - 1]].erase(circle[i]);
  123.         g[circle[i]].erase(circle[i - 1]);
  124.     }*/
  125.     fl = false;
  126.     color.assign(n,0);
  127.     for (int i = 0; i < n; i++)
  128.     {
  129.         if (color[i] != 0)
  130.             continue;
  131.         fl = dfs(i, -1);
  132.         if (fl)
  133.             break;
  134.     }
  135.     if (fl)
  136.     {
  137.         cout<<"NO"<<endl;
  138.         return 0;
  139.     }
  140.     SNM snm(n);
  141.  
  142.     for (int i = 0; i < n; i++)
  143.     {
  144.         for (int j = 1; j < g[i].size(); j++)
  145.         {
  146.             snm.Merge(g[i][j], g[i][j-1]);
  147.         }
  148.     }
  149.     set<int> st;
  150.     for (int i = 0; i < n; i++)
  151.     {
  152.         st.insert(snm.Get(i));
  153.     }
  154.     if (st.size() < 3)
  155.         cout<<"NO"<<endl;
  156.     else
  157.         cout<<"FHTAGN!"<<endl;
  158.  
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement