题目: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. HDU1257-最少拦截系统

    描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来 ...

  2. git切换远程

    已经开发一段时日,公司突然提出要换git仓库 查看目前所有的分支 $git branch -va 添加新的远程仓库 $ git remot add [name] [url] 查看下目前配置 $ git ...

  3. Android 开发笔记“Application 理解”

    Android 中Application类用法 1.             Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...

  4. ASP.NET MVC5 学习笔记-5 测试

    1. 测试步骤 准备 执行 检查 2. 创建单元测试 注意:单元测试不要包含数据库操作,包含数据库操作的一般成为集成测试. 2.1 编写测试代码 namespace AspNetMVCEssentia ...

  5. 启动及重新启动nginx,重启nginx后丢失nginx.pid问题解决

    停止操作 停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的 步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程 ...

  6. android AChartEngine源代码

    昨天翻自己曾经下过的apache开源project项目,看到一个AChartEnginee看了一下自带的Demo才意识到这个东西的强大.立刻想把源代码down一份,在CSDN上有人挂5分让人下载,实在 ...

  7. [cocos2dx笔记011]使用Cocostudio UI编辑器

    本文地址:http://www.cppblog.com/zdhsoft/archive/2014/07/19/207715.html 笔记汇总:http://www.cppblog.com/zdhso ...

  8. 跨域引入iframe 自适应高度

    最近和别的公司合作一个项目,需要从他们那边引入一个页面,刚开始想的挺简单的,用iframe 引入就好啦,可是操作中才发现,自适应的问题不好解决,试了挺多办法,最终找到一个比较好的方法,记录一下,留着备 ...

  9. Live Writer Test

    测试下LiveWriter写CNblog: 1.Source code plug-in: @Override public List getAll(String orgid,String start, ...

  10. cordova安装--创建ionic项目

    1.简介ionic ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework ). 可以帮助您使用 Web 技术,比如 HTML.CS ...