AlenAntonelli

es un Arbol?

Jul 17th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. ///https://trello.com/c/GF5EGjZq/18-2012n2p1-es-un-%C3%A1rbol
  2. ///http://www.oia.unsam.edu.ar/_media/prob/c3a12n2p1.pdf
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. struct grafo {
  8.    
  9.     vector< vector<int> > ady;
  10.     vector< vector<int> > p;
  11.     vector<bool> visit;
  12.     int n, m;
  13.     bool arbol = true;
  14.    
  15.     void leer()
  16.     {
  17.         cin>>n>>m;
  18.        
  19.         ady.resize(n+1);
  20.         p.resize(n+1);
  21.         visit = vector<bool> (n+1, false);
  22.        
  23.         int a, b;
  24.         for (int i=0; i<m; i++)
  25.         {
  26.             cin>>a>>b;
  27.             ady[a].push_back(b);
  28.             p[b].push_back(a);
  29.         }
  30.     }
  31.    
  32.     void DFS (int nodo)
  33.     {
  34.         visit[nodo] = true;
  35.        
  36.         for (int i=0; i<ady[nodo].size(); i++)
  37.         {
  38.             int vecino = ady[nodo][i];
  39.            
  40.             if ( !visit[vecino] )
  41.                 DFS(vecino);
  42.             else arbol = false;
  43.         }
  44.     }
  45.    
  46.     void resp ()
  47.     {
  48.         int raiz, raices=0, raras=0;
  49.        
  50.         for (int i=1; i<=n; i++)
  51.         {
  52.             if ( !p[i].size() )
  53.                 raices++, raiz=i;
  54.             if ( p[i].size() > 1 )
  55.                 raras++;
  56.         }
  57.                
  58.         if  ( (m+1) != n || raras || raices != 1 )
  59.             arbol = false;
  60.        
  61.        
  62.         if (arbol)
  63.             cout<<"Si";
  64.         else
  65.         {
  66.             cout<<"No"<<endl;
  67.            
  68.             for (int i=1; i<=n; i++)
  69.                 if ( !p[i].size() )
  70.                     cout<<i<<" ";
  71.            
  72.             if (!raices)
  73.                 cout<<raices;
  74.             cout<<endl;
  75.            
  76.            
  77.             if (raices == 1)
  78.             {
  79.                 for (int i=1; i<=n; i++)
  80.                     if ( (i != raiz) && (p[i].size() != 1) )
  81.                         cout<<i<<" ";
  82.                
  83.                 if (!raras)
  84.                     cout<<raras;
  85.             }
  86.             else
  87.             {
  88.                 for (int i=1; i<=n; i++)
  89.                     if ( p[i].size() != 1 )
  90.                         cout<<i<<" ";
  91.                        
  92.                 if (!raices && !raras)
  93.                     cout<<raras;
  94.             }
  95.             cout<<endl;
  96.            
  97.             if ( raices==1 )
  98.             {
  99.                 DFS(raiz);
  100.                 for (int i=1; i<=n; i++)
  101.                     if (!visit[i])
  102.                         cout<<i<<" ";
  103.                
  104.                 if (!raras)
  105.                     cout<<"0";
  106.             }
  107.             else cout<<"0";
  108.             cout<<endl;
  109.         }
  110.     }
  111.    
  112. };
  113.  
  114. int main()
  115. {
  116.     grafo g;
  117.     g.leer();
  118.     g.resp();
  119.    
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment