Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///https://trello.com/c/GF5EGjZq/18-2012n2p1-es-un-%C3%A1rbol
- ///http://www.oia.unsam.edu.ar/_media/prob/c3a12n2p1.pdf
- #include <iostream>
- #include <vector>
- using namespace std;
- struct grafo {
- vector< vector<int> > ady;
- vector< vector<int> > p;
- vector<bool> visit;
- int n, m;
- bool arbol = true;
- void leer()
- {
- cin>>n>>m;
- ady.resize(n+1);
- p.resize(n+1);
- visit = vector<bool> (n+1, false);
- int a, b;
- for (int i=0; i<m; i++)
- {
- cin>>a>>b;
- ady[a].push_back(b);
- p[b].push_back(a);
- }
- }
- void DFS (int nodo)
- {
- visit[nodo] = true;
- for (int i=0; i<ady[nodo].size(); i++)
- {
- int vecino = ady[nodo][i];
- if ( !visit[vecino] )
- DFS(vecino);
- else arbol = false;
- }
- }
- void resp ()
- {
- int raiz, raices=0, raras=0;
- for (int i=1; i<=n; i++)
- {
- if ( !p[i].size() )
- raices++, raiz=i;
- if ( p[i].size() > 1 )
- raras++;
- }
- if ( (m+1) != n || raras || raices != 1 )
- arbol = false;
- if (arbol)
- cout<<"Si";
- else
- {
- cout<<"No"<<endl;
- for (int i=1; i<=n; i++)
- if ( !p[i].size() )
- cout<<i<<" ";
- if (!raices)
- cout<<raices;
- cout<<endl;
- if (raices == 1)
- {
- for (int i=1; i<=n; i++)
- if ( (i != raiz) && (p[i].size() != 1) )
- cout<<i<<" ";
- if (!raras)
- cout<<raras;
- }
- else
- {
- for (int i=1; i<=n; i++)
- if ( p[i].size() != 1 )
- cout<<i<<" ";
- if (!raices && !raras)
- cout<<raras;
- }
- cout<<endl;
- if ( raices==1 )
- {
- DFS(raiz);
- for (int i=1; i<=n; i++)
- if (!visit[i])
- cout<<i<<" ";
- if (!raras)
- cout<<"0";
- }
- else cout<<"0";
- cout<<endl;
- }
- }
- };
- int main()
- {
- grafo g;
- g.leer();
- g.resp();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment