uva 12442 . Forwarding Emails

"... so forward this to ten other people, to prove that you believe the emperor has

题意是说发短信,每个人只会给一个人发,问从哪个人开始发,能传到的人最多

思路是每个人开始做一遍dfs...

毫无意外的TLE了

一个容易想到的剪枝是,如果在第i次之前的路径上的点,在之后以它作为起点遍历一定不优.

我们可以用一个数组vis标记上(注意不要和为了dfs的标记数组vis2混淆,vis2标记的主要作用是判断是否成环)

sad,看来还是要提高自己的搜索姿势啊....

 1 
 2
 3    
 4    /*************************************************************************
 5    	> File Name: code/2015summer/sea#2/B.cpp
 6    	> Author: 111qqz
 7    	> Email: rkz2013@126.com 
 8    	> Created Time: 2015年07月28日 星期二 14时59分16秒
 9     ************************************************************************/
10    
11    #include<iostream>
12    #include<iomanip>
13    #include<cstdio>
14    #include<algorithm>
15    #include<cmath>
16    #include<cstring>
17    #include<string>
18    #include<map>
19    #include<set>
20    #include<queue>
21    #include<vector>
22    #include<stack>
23    #define y0 abc111qqz
24    #define y1 hust111qqz
25    #define yn hez111qqz
26    #define j1 cute111qqz
27    #define tm crazy111qqz
28    #define lr dying111qqz
29    using namespace std;
30    #define REP(i, n) for (int i=0;i<int(n);++i)  
31    typedef long long LL;
32    typedef unsigned long long ULL;
33    const int N=5E4+7;
34    int a[N];
35    bool vis[N],vis2[N];
36    int  u,v,n;
37    int dfs(int x)
38    {
39        int res=0;
40        vis2[x]=true;
41        int tmp = a[x];
42        if (!vis2[tmp])
43        {
44    	  res = dfs(tmp)+1; //当前这个认能传的长度=他传的人能传的长度+1
45        }
46        vis[x] = true;
47        vis2[x] = false;
48        return res;
49    
50        
51    
52    
53    }
54    int main()
55    {
56        int T;
57        cin>>T;
58        int cas = 0;
59        while (T--)
60        {
61    	  memset(vis,false,sizeof(vis));
62    	  cas++;
63    	  scanf("%d",&n);
64    	  for ( int  i = 0 ; i < n;  i++ )
65    	  {
66    		scanf("%d %d",&u,&v);
67    		a[u]=v;
68    	  }
69    	  int mx = - 1;
70    	  int ans;
71    	  for ( int i = 1 ; i <= n ; i++)
72    	  {
73    	//	memset(vis2,false,sizeof(vis2));
74    		if (vis[i]) continue;   //如果在上一次的dfs中经过了i,那么从i开始传播一定是之前标记i的那次开始传播的子链,一定不优.
75    		int tmp = dfs(i);
76    //		cout<<dfs(i,1)<<endl;
77    		if (tmp>mx)
78    		{
79    		    mx = tmp;
80    		    ans = i;
81    		}
82    	  }
83    	  printf("Case %d: %d\n",cas,ans);
84    	  
85        }
86      
87    	return 0;
88    }
89    
90
91
92
93