题目:Click here

题意:我就喜欢中文题!

分析:这个题虽然是中文题,但是还是有一点费解的。其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子。思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问。

模拟链表实现的邻接表:

 #include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int M = +; struct Edge { // 邻接表的结点
int v, next;
}edge[M<<]; int n, root, E, q;
int cnt;
bool vis[M];
int head[M]; // 邻接表头结点 void newedge( int u, int v ) { // 连接一条边
edge[E].v = v;
edge[E].next = head[u];
head[u] = E;
E++;
} void dfschaneg( int root ) { // 将无向图转换成有向图
vis[root] = true;
for( int i=head[root]; i!=-; i=edge[i].next )
if( !vis[edge[i].v] ) dfschaneg( edge[i].v );
else edge[i].v = INF; // 将访问过的点标记INF,之后dfs时就不会再访问了
} void dfs( int pos ) { // dfs遍历子树
cnt++;
for( int i=head[pos]; i!=-; i=edge[i].next )
if( edge[i].v != INF )
dfs( edge[i].v );
} int main() {
#ifdef ONLINE_JUDGE
#else
freopen( "in.txt", "r", stdin );
#endif
while( ~scanf("%d %d", &n, &root ) ) {
E = ;
memset( vis, false, sizeof(vis) );
memset( head, -, sizeof(head) );
for( int i=; i<n; i++ ) {
int x, y;
scanf("%d %d", &x, &y );
newedge( x, y ); // 由于是无向图,所以x到y,y到x都有边
newedge( y, x );
}
dfschaneg( root );
scanf("%d", &q );
for( int i=; i<q; i++ ) {
int pos;
scanf("%d", &pos );
cnt = ;
dfs( pos );
printf("%d\n", cnt );
}
}
return ;
}

使用vector实现的邻接表:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define pb push_back
using namespace std;
const int M = 1e4+;
const int INF = 0x3f3f3f3f; int n, root, q;
vector<int> v[M]; // vector实现的邻接表,v[i]这个vector存的是与i邻接的顶点
bool vis[M];
int cnt; void dfschange( int pos ) { // 将无向图转换成有向图
vis[pos] = true;
for( int i=; i<v[pos].size(); i++ ) {
if( !vis[v[pos][i]] ) {
dfschange( v[pos][i] );
}
else {
v[pos][i] = INF; // 将访问过的点标记INF,之后dfs时就不会再访问了
}
}
return ;
} void dfs( int x ) {
cnt++;
for( int i=; i<v[x].size(); i++ ) {
if( v[x][i] != INF )
dfs( v[x][i] );
}
return ;
} int main() {
while( ~scanf("%d %d", &n, &root ) ) {
for( int i=; i<M; i++ ) {
v[i].clear();
}
for( int i=; i<n-; i++ ) {
int x, y;
scanf("%d %d", &x, &y );
v[x].pb(y); // 由于是无向图,所以x到y,y到x都有边
v[y].pb(x);
}
memset( vis, false, sizeof(vis) );
dfschange( root );
scanf("%d", &q );
for( int i=; i<q; i++ ) {
int x;
scanf("%d", &x );
cnt = ;
dfs( x );
printf("%d\n", cnt );
}
}
return ;
}

本人原创文章,转载请注明出处:http://www.cnblogs.com/TaoTaoCome/p/4719282.html

ZSTU OJ 3999 零基础学算法---邻接表的更多相关文章

  1. 零基础学C#算法(零基础学算法——C#版)

    今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...

  2. 零基础学python-5.2 数字表达式操作符

    表达式是处理数字最主要的工具 a=1#常量 a=a+1#表达式 操作符 操作符 描写叙述 yield 生成 器函数发送协议 lambda args:expression 生成匿名函数 x if y e ...

  3. 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

    机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...

  4. 【雕爷学编程】MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

    配套 2.4寸LCD屏 ST7789驱动器芯片(24P 320X240) ST7789驱动器芯片2.4寸LCD屏(24P 320X240)主要参数 1. 模块名称:液晶显示模块2. 型号:KD024C ...

  5. 【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色

    早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运 ...

  6. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  7. 《Windows编程零基础学》第零节

    首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...

  8. 【视频】零基础学Android开发:蓝牙聊天室APP(四)

    零基础学Android开发:蓝牙聊天室APP第四讲 4.1 ListView控件的使用 4.2 BaseAdapter具体解释 4.3 ListView分布与滚动事件 4.4 ListView事件监听 ...

  9. 【视频】零基础学Android开发:蓝牙聊天室APP(二)

    零基础学Android开发:蓝牙聊天室APP第二讲 2.1 课程内容应用场景 2.2 Android UI设计 2.3 组件布局:LinearLayout和RelativeLayout 2.4 Tex ...

随机推荐

  1. iOS 纯代码适配iPhone6,6+

    链接地址:http://blog.csdn.net/codywangziham01/article/details/37658399 转自:http://www.maxiaoguo.com/cloth ...

  2. JS字符串方法总结整理

    //javascript字符串方法总结   1.String.charAt(n)      //取得字符串中的第n个字符   2.String.charCodeAt(n)  //取得字符串中第n个字符 ...

  3. JavaEE Tutorials (8) - Java持久化API介绍

    8.1实体96 8.1.1实体类的需求97 8.1.2实体类中的持久化字段和属性97 8.1.3实体的主键101 8.1.4实体关系中的多重性103 8.1.5实体关系中的方向103 8.1.6实体中 ...

  4. BZOJ 3211 花神游历各国 (树状数组+并查集)

    题解:首先,单点修改求区间和可以用树状数组实现,因为开平方很耗时间,所以在这个方面可以优化,我们知道,开平方开几次之后数字就会等于1 ,所以,用数组记录下一个应该开的数,每次直接跳到下一个不是1的数字 ...

  5. Servlet 基础知识

    8.Response  8.1.getOutputStream和getWriter方法分别用于得到输出二进制数据.输出文本数据的ServletOutputStream .Printwriter对象.  ...

  6. hdoj 3478 Catch(二分图判定+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 思路分析:该问题需要求是否存在某一个时刻,thief可能存在图中没一个点:将该问题转换为图论问题 ...

  7. iostream.h 和stdio.h区别

    stdio.h是C的标准I/O库,是以函数的方式向buffer写入或读取字符.输入输出是这样的printf(...);,scanf(...); iostream是C++的标准I/O库,引入了输入/输出 ...

  8. block 解析 - 局部变量

    局部变量 block内使用局部变量,一般都是截获变量(只读),截获离block初始化最近的一次的值. 引用官方文档: Stack (non-static) variables local to the ...

  9. Tableau 群集部署

    由于公司连续两个月月底Tableau服务器过载崩溃,因此有了搭建Tableau服务器群集的想法.目前还在测试阶段,所以做一步写一步了. 目录: 一.安装和配置工作服务器 二.其他参考文档 一. 安装和 ...

  10. Jsp中使用EL表达式对字符串进行操作

    用fn函数:<%@ taglib prefix="fn" uri="http://Java.sun.com/jsp/jstl/functions" %&g ...