码迷,mamicode.com
首页 > 编程语言 > 详细

ZSTU OJ 3999 零基础学算法---邻接表

时间:2015-08-10 22:03:25      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

题目:Click here

 

题意:我就喜欢中文题!

分析:这个题虽然是中文题,但是还是有一点费解的。其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子。思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问。(的确有点麻烦,并且这次使用vector实现的邻接表,学长教的有点难懂,近期更新上来)

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring> 
 4 #include <algorithm>
 5 #include <vector> 
 6 #define pb push_back
 7 using namespace std;
 8 const int M = 1e4+5;
 9 const int INF = 0x3f3f3f3f;
10 
11 int n, root, q;
12 vector<int> v[M];   // vector实现的邻接表,v[i]这个vector存的是与i邻接的顶点
13 bool vis[M];
14 int cnt;
15 
16 void dfschange( int pos )  {    // 将无向图转换成有向图
17     vis[pos] = true;
18     for( int i=0; i<v[pos].size(); i++ )    {
19         if( !vis[v[pos][i]] )    {
20             dfschange( v[pos][i] );
21         }
22         else    {
23             v[pos][i] = INF;    // 将访问过的点标记INF,之后dfs时就不会再访问了
24         }
25     }
26     return ;
27 }
28 
29 void dfs( int x )   {
30     cnt++;
31     for( int i=0; i<v[x].size(); i++ )    {
32         if( v[x][i] != INF )
33             dfs( v[x][i] );
34     }
35     return ;
36 }
37 
38 int main()  {
39     while( ~scanf("%d %d", &n, &root ) )    {
40         for( int i=0; i<M; i++ )    {
41             v[i].clear();
42         }
43         for( int i=0; i<n-1; i++ )  {
44             int x, y;
45             scanf("%d %d", &x, &y );
46             v[x].pb(y);     // 由于是无向图,所以x到y,y到x都有边
47             v[y].pb(x);
48         }
49         memset( vis, false, sizeof(vis) );
50         dfschange( root );
51         scanf("%d", &q );
52         for( int i=0; i<q; i++ )    {
53             int x;
54             scanf("%d", &x );
55             cnt = 0;
56             dfs( x );
57             printf("%d\n", cnt );
58         }
59     }    
60     return 0;
61 }

 

ZSTU OJ 3999 零基础学算法---邻接表

标签:

原文地址:http://www.cnblogs.com/TaoTaoCome/p/4719282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!