Advertisement
GastonFontenla

Untitled

Sep 29th, 2018
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. #define blanco 1 ///NO VISITADO
  7. #define gris 2 ///EN PROCESO
  8. #define negro 3 ///PROCESADO
  9. #define anulado -1 ///YA NO FORMA PARTE DEL GRAFO
  10.  
  11. int N, M;
  12. vector <vector <int> > adj;
  13. vector <int> colorNodo;
  14.  
  15. void DFS_KILLER(int n)
  16. {
  17.     colorNodo[n] = anulado;
  18.  
  19.     for(int i=0; i<adj[n].size(); i++)
  20.         if(colorNodo[adj[n][i]] != anulado)
  21.             DFS_KILLER(adj[n][i]);
  22. }
  23.  
  24. void DFS(int n)
  25. {
  26.     colorNodo[n] = gris;
  27.  
  28.     for(int i=0; i<adj[n].size(); i++)
  29.     {
  30.         ///Si el nodo vecino está en color blanco, lo visito
  31.         if(colorNodo[adj[n][i]] == blanco)
  32.             DFS(adj[n][i]);
  33.         else if(colorNodo[adj[n][i]] == gris) ///Hallé ciclo
  34.             DFS_KILLER(adj[n][i]);
  35.     }
  36.  
  37.     colorNodo[n] = negro;
  38. }
  39.  
  40. vector <int> orden;
  41. vector <bool> visitado;
  42. void OrdenTopologico(int n)
  43. {
  44.     visitado[n] = true;
  45.     for(int i=0; i<adj[n].size(); i++)
  46.         if(visitado[adj[n][i]] == false && colorNodo[adj[n][i]] != anulado)
  47.             OrdenTopologico(adj[n][i]);
  48.     orden.push_back(n);
  49. }
  50.  
  51. int main()
  52. {
  53.     cin >> N >> M;
  54.  
  55.     adj.resize(N+1);
  56.     colorNodo = vector <int> (N+1, blanco);
  57.     visitado = vector <bool> (N+1, false);
  58.  
  59.     for(int i=0; i<M; i++)
  60.     {
  61.         int a, b;
  62.         cin >> a >> b;
  63.         adj[a].push_back(b);
  64.     }
  65.  
  66.     DFS(1);
  67.     OrdenTopologico(1);
  68.  
  69.     ///Ahora que anulé nodos (si fuera necesario) puedo hacer la DP en grafos
  70.  
  71.     vector <int> cantCaminos(N+1, 0);
  72.     cantCaminos[1] = 1;
  73.  
  74.     for(int j=orden.size()-1; j>=0; j--)
  75.     {
  76.         int n = orden[j];
  77.         for(int i=0; i<adj[n].size(); i++)
  78.         {
  79.             if(colorNodo[adj[n][i]] != anulado)
  80.             {
  81.                 cantCaminos[adj[n][i]] += cantCaminos[n];
  82.                 cantCaminos[adj[n][i]] %= 1000000000;
  83.             }
  84.         }
  85.     }
  86.  
  87.     if(colorNodo[N] == anulado)
  88.     {
  89.         cout << "INFINITE PATHS" << endl;
  90.     }
  91.     else
  92.     {
  93.         cout << cantCaminos[N] << endl;
  94.     }
  95.  
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement