设为首页 加入收藏

TOP

BNU Training 2015 07 27 题解(二)
2015-11-21 00:56:58 来源: 作者: 【 】 浏览:7
Tags:BNU Training 2015 题解
esent this graph using one dimensional array adj[N]. Do not need to stack, you can use recursion.
Example:
4
1 2
2 1
4 3
3 2
The adjacency list, adj[1]=2, adj[2]=1, adj[3]=2, and adj[4]=3.
Use a boolean array visit[N]
 
 

visit[1]

visit[2]

visit[3]

visit[4]

False

False

False

False

At first start from 1
If visit[1]==false then run DFS in this time count the visited node and update the visit[] array 
(Set visit[i]=True here i is a visited node).  
Remember dot not use the array visit[] for cycle finding you can use another boolean array visit2[] for that purpose. 
After run DFS the visit[] array is
 
 
 
 

visit[1]

visit[2]

visit[3]

visit[4]

True

True

False

False

And count_visited_node=2 (1->2)
Now 2
visit[2]==true so, do not need to do anything.
 
 
Now 3
visit[3]==false so, run the DFS. After that the visit[] array is
 
 
 
 
 
 

visit[1]

visit[2]

visit[3]

visit[4]

True

True

True

False

And count_visited_node=3 (3->2->1)
 
 
Now 4
visit[4]==false so, run the DFS. After that the visit[] array is
 
 
 
 

visit[1]

visit[2]

visit[3]

visit[4]

True

True

True

True

And count_visited_node=4 (4->3->2->1)
 
 
For 4, the count_visited_node is maximum. Ans is 4.
代码:
#include 
   
     #define MAX 50005 int T,N; int vis[MAX], f[MAX], c[MAX]; int ans, flag; typedef long long LL; inline LL read() { int c=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} return c*f; } int dfs(int u) { int v = f[u];/// 2=f[1];1=f[2];2=f[3]; int r = 0; /// vis[u] = 1; /// vis[1]=1;vis[2]=1;vis[3]=1; if(!vis[v]) r = dfs(v) + 1;///vis[2]=1,r=0+1=1; vis[u] = 0; c[u] = r; ///c[1]=1,c[2]=0,c[3]=2; return r; } int main() { int u,v; T=read(); for(int t=1; t<=T; t++){ N=read(); for(int i=1; i<=N; i++){ u=read(),v=read(); f[u] = v; vis[u] = 0; c[u] = -1; } ans = -1; for(int i=1; i<=N; i++){ if(c[i]==-1) dfs(i); if(c[i]>m) { m=c[i]; flag=i; } /* printf(vertex %d children %d ,i,c[i]);*/ } printf(Case %d: %d ,t,flag); } return 0; }
   

几组数据:

?

?

7
3
1 2
2 3
3 1
4
1 2
2 1
4 3
3 2
5
1 2
2 1
5 3
3 4
4 5
2
1 2
2 1
3
1 2
2 3
3 1
4
4 2
2 1
4 3
3 2
10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 1
Case 1: 1
Case 2: 4
Case 3: 3
Case 4: 1
Case 5: 1
Case 6: 4
Case 7: 1

?

?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Codeforces gym 100517(二分,同.. 下一篇HDU 4293 Groups(区间dp)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: