题目: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. JavaSE_ 多线程 总目录(23~24)

    JavaSE学习总结第23天_多线程123.01 多线程程序的引入23.02 进程概述及多进程的意义23.03 线程概述及多线程的意义23.04 并行和并发的区别23.05 Java程序运行原理和JV ...

  2. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

  3. Snap.svg中transform旋转值的“r+数组”表现形式

    Snap.svg中transform的值还可以写为类似以下这种形式: transform:'r'+[100,[50,50]]; 这种写法的意思是,让元素以(50,50)为旋转中心点,然后旋转100度. ...

  4. 运用DIV拖拽实现resize和碰撞检测

    运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...

  5. [LeetCode]题解(python):007-Reverse Integer

    题目来源: https://leetcode.com/problems/reverse-integer/ 题意分析: 这道题目很简单,就是将一个数反转,123变321,-123变321. 题目思路: ...

  6. 07-C语言流程控制if、switch

    目录: 一.流程控制 条件分支 if else 二.流程控制 开关分支 switch 回到顶部 一.流程控制 条件分支 1.语法格式:if(表达式1){ //表达式1为真(非0时),执行的语句部分. ...

  7. HDU 3486 Interviewe

    题目大意:给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之.现在让我们找最小的k使得和严格大于m. 题解:二分k,然后求RMQ检验. S ...

  8. HDOJ 2102 A计划(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 ...

  9. Android4.3模拟器界面中右侧菜单按钮无法使用问题解决办法

    开发环境:笔记本电脑Windows2008+MyEclipse 10+Android4.3 问题描述:运行或者调试Android项目时,发现模拟器中右侧Menu按钮无法点击,截图如下: 查看在Andr ...

  10. TextBox控件只允许输入出生日期,并验证年龄不得小于18岁

    1.Body tag <form id="form1" runat="server"> <div> <asp:Label ID=& ...