Advertisement
Guest User

Untitled

a guest
Jul 21st, 2016
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define loop(i, n) for (int i=0;i<n;i++)
  4. #define lv(i, v) for (int i=0;i<adj[v].size();i++)
  5. #define MAXN INT_MAX
  6. #define F first
  7. #define S second
  8.  
  9. using namespace std;
  10. const int MAX = 5e5+9;
  11. const int MIN = 1e3+9;
  12. int arr[MAX],A[MAX];
  13. bool vis[MAX],done[MAX];
  14. vector <int> adj[MAX];
  15.  
  16. void DFS (int v){
  17. done [v] = 1;
  18. lv (i, v){
  19. int u = adj[v][i];
  20. if (!done[u]){
  21. DFS (u);
  22. }
  23. }
  24. }
  25.  
  26. int check (int v){
  27. vis[v] = 1;
  28. lv (i, v){
  29. int u = adj[v][i];
  30. //cout << u << " " << v << " " << arr[u] << endl;
  31. if (u == v) return u;
  32. else if (vis[u]) return MAX;
  33. check (u);
  34. }
  35. }
  36.  
  37. int main ()
  38. {
  39. int n, root = -1, temp , res = 0, t = 1;
  40. scanf("%d", &n);
  41. loop (i, n) {
  42. scanf("%d", &arr[i]);
  43. arr[i]--;
  44. A[i] = arr[i];
  45. if (arr[i] == i) root = i ;
  46. }
  47. cout << root << endl ;
  48. loop (i, n){
  49. adj[i].pb(arr[i]);
  50. }
  51. loop (i,n){
  52. memset(vis, 0, sizeof(vis));
  53.  
  54. temp = check(i);
  55. cout << temp << " " << check(i) << endl ;
  56.  
  57. if (i == root || done [i]) continue ;
  58. else if (temp == MAX && temp != root){
  59. A[i] = root;
  60. DFS (i);
  61. }
  62. else {
  63. A[temp] = root ;
  64. DFS (i);
  65. }
  66. }
  67. //loop(i, n)
  68. // if (arr[i] != A[i]) res++;
  69. //printf("%d\n",res);
  70. //loop(i, n)
  71. // printf("%d ",A[i]+1);
  72. return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement