P2661 信息传递

P2661 信息传递
dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的。]

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<map>
  9 #include<stack>
 10 #include<cstring>
 11 #define inf 2147483647
 12 #define For(i,a,b) for(register int i=a;i<=b;i++)
 13 #define p(a) putchar(a)
 14 #define g() getchar()
 15 //by war
 16 //2017.11.5
 17 using namespace std;
 18 int n;
 19 bool vis[200010];
 20 int x;
 21 int ans;
 22 int d[200010];
 23 int t[200010];
 24 struct node
 25 {
 26     int n;
 27     node *next;
 28 }*e[200010];
 29 void in(int &x)
 30 {
 31     int y=1;
 32     char c=g();x=0;
 33     while(c<'0'||c>'9')
 34     {
 35     if(c=='-')
 36     y=-1;
 37     c=g();
 38     }
 39     while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
 40     x*=y;
 41 }
 42 void o(int x)
 43 {
 44     if(x<0)
 45     {
 46         p('-');
 47         x=-x;
 48     }
 49     if(x>9)o(x/10);
 50     p(x%10+'0');
 51 }
 52 
 53 void push(int x,int y)
 54 {
 55     node *p;
 56     p=new node();
 57     p->n=y;
 58     if(e[x]==NULL)
 59     e[x]=p;
 60     else
 61     {
 62         p->next=e[x]->next;
 63         e[x]->next=p;
 64     }
 65 }
 66 
 67 void dfs(int now,int dis,int Time)
 68 {
 69     d[now]=dis;
 70     vis[now]=true;
 71     t[now]=Time;
 72     for(node *i=e[now];i!=NULL;i=i->next)
 73     if(vis[i->n])
 74     {
 75     if(t[now]==t[i->n])
 76     ans=min(ans,d[now]-d[i->n]+1);    
 77     }    
 78     else    
 79     dfs(i->n,dis+1,Time);
 80 }
 81 
 82 int main()
 83 {
 84     in(n);
 85     For(i,1,n)
 86     {
 87         in(x);
 88         push(i,x);
 89     }
 90     ans=inf;
 91     For(i,1,n)
 92     {
 93         if(!vis[i])
 94         {
 95         t[i]=i;
 96         dfs(i,0,i);    
 97         }
 98     }
 99     o(ans);
100      return 0;
101 }

 

posted @ 2017-11-06 07:49  WeiAR  阅读(272)  评论(0编辑  收藏  举报