Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 5th, 2012  |  syntax: None  |  size: 2.58 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <cstdio>
  2. #include <iostream>
  3. using std::cin;
  4. using std::cout;
  5.  
  6. class Graph {
  7. public:
  8.         int N;
  9.         virtual ~Graph() = 0 {}
  10.  
  11.         virtual void addEdge(int i, int j) = 0;
  12.         virtual bool dfs (int v, int colour[], int cycleSt, int cycleEnd, int p[]) = 0;
  13. };
  14.  
  15. struct list{
  16.         int value;
  17.         list* next;
  18. };
  19.  
  20. class List: public Graph {
  21.         list **l;
  22. public:
  23.  
  24.         List(){
  25.                 this->l=NULL;
  26.         }
  27.  
  28.         List(int n){
  29.                 N = n;
  30.                 this->l=new list*[n+1];
  31.                 for(int i=1; i<=N; i++){
  32.                         this->l[i] = new list;
  33.                         this->l[i]->next = NULL;
  34.                         this->l[i]->value = i;
  35.                 }
  36.         }
  37.         void addEdge(int i, int j);
  38.         bool dfs (int v, int colour[], int cycleSt, int cycleEnd, int p[]);
  39.         void printList();
  40.  
  41.        
  42.         ~List(){
  43.                 delete l;
  44.         }
  45. };
  46.  
  47. void List::addEdge(int i, int j) {
  48.         if(this->l[i]->next == NULL){
  49.                 this->l[i]->next = new list;
  50.                 this->l[i]->next->next = NULL;
  51.                 this->l[i]->next->value = j;
  52.         } else {
  53.                 list *temp;
  54.                 temp = l[i]->next;
  55.                 while(temp->next !=NULL) {
  56.                         temp = temp->next;
  57.                 }
  58.                 temp->next = new list;
  59.                 temp->next->next = NULL;
  60.                 temp->next->value = j;
  61.         }
  62.  }
  63.  
  64. /*
  65. void List::printList () {
  66.       for ( int i = 1; i <= N; i++ ) {
  67.                   std::cout << i << " ";
  68.                   list* temp = l[i];
  69.                   if ( temp != NULL ) {
  70.                         temp = temp->next;
  71.                   }
  72.                   while ( temp != NULL ) {
  73.                                 std::cout << temp->value << " ";
  74.                                 temp = temp->next;
  75.           }
  76.                   printf ("\n");
  77.           }
  78. }
  79. */
  80.  
  81. bool List::dfs (int v, int colour[],int cycleSt,int cycleEnd,int p[]) {
  82.                 colour[v] = 1;
  83.                 while (l[v] != NULL){
  84.                         int t = l[v]->value;
  85.                         if (colour[t] == 0) {
  86.                                 p[t] = v;
  87.                                 if (dfs(t, colour, cycleSt, cycleEnd, p))  
  88.                                         return true;
  89.                         }
  90.                         else
  91.                                 if (colour[t] == 1) {
  92.                                 cycleSt = v;
  93.                                 cycleEnd = t;
  94.                                 return true;
  95.                                 }
  96.                         l[v] = l[v]->next;
  97.                 }
  98.  
  99.                 colour[v] = 10;
  100.                 return false;
  101. }
  102.  
  103.  
  104. int main() {
  105.  
  106.         int n, m;
  107.         int cycleSt = -1;
  108.         int cycleEnd = 0;
  109.  
  110.         int colour[500000] = {0};
  111.         int p[500000];
  112.  
  113.         freopen ("cycle.in", "r", stdin);
  114.         freopen ("cycle.out", "w", stdout);
  115.  
  116.         scanf("%d %d\n", &n, &m);
  117.  
  118.         List g(m);
  119.  
  120.         int a, b;
  121.     for (int i = 1; i <= m; i++) {
  122.                 scanf("%d %d\n", &a, &b);
  123.         g.addEdge(a, b);
  124.     }
  125.  
  126.         for (int i = 1; i <= n; ++i)
  127.                         if (colour[i] == 0)
  128.                                 if (g.dfs(i, colour, cycleSt, cycleEnd, p))
  129.                                         break;
  130.  
  131.                 if (cycleSt == -1)
  132.                         printf("NO");
  133.                 else
  134.                 {
  135.                         printf("YES\n");
  136.                         int order[500000];
  137.                         int i = 0;
  138.                         for (int v = cycleSt; v != cycleSt; v = p[v])
  139.                         {
  140.                                 order[i] = v;
  141.                                 ++i;
  142.                         }
  143.                         order[i] = cycleSt;
  144.  
  145.                         for (i; i >= 0; i--)
  146.                                 printf("%d ", order[i]);
  147.                 }      
  148.  
  149.         //g.printList();
  150.  
  151.         return 0;
  152. }