题目: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. 【转载】VC++中的图像类型转换--使用开源CxImage类库

    一.CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用. CxImage类库是一个优秀的图像操作类库.它可以快捷地存取.显示.转换各种图像.有的读者可能说,有那么多优 ...

  2. servlet同一用户的不同页面共享数据

    一.cookie技术 cookie的讲解和使用 --------------- 服务器在客户端保存用户的信息,比如登录名,密码等...就是cookie, 服务器端在需要时可以从客户端读取. cooki ...

  3. Delphi调试DLL 不能调试 不能进入调试 注意!!!

    如何调试DLL,在这里就不再赘述了,但是,今天就碰到了一个特别奇怪的问题,参数设置正确,就是不能调试?? 通过上网查资料,发现了问题,注意: 1, 将Project主菜单的Project Option ...

  4. sqlite性能简单測试

    主要測试sqlite在大数据量下的插入及查询性能: 測试环境:Centos6.4  1G内存  单核 数据量 大小 索引字段检索(耗时) 非索引字段检索(耗时) 总插入时间 10W 19M 0.001 ...

  5. GDI+入门——带你走进Windows图形的世界

    一.GDI+基础 1.GDI+简单介绍 GDI+是微软的新一代二维图形系统,它全然面向对象,要在Windows窗口中显示字体或绘制图形必需要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象, ...

  6. SharePoint代码段设计

    参考文章: 1. SharePoint 2013设计管理器代码段 https://msdn.microsoft.com/zh-cn/library/jj822367 2. 如何在SharePoint中 ...

  7. 上传列表集合wsp包

    1. 网站设置--web设计器库--解决方案--上载解决方案 2. 打开SPD,左侧的子网站--新建

  8. android studio使用的各种问题

    1.添加权限,没有图形界面.添加权限的位置在<application>节点外,如果在节点内添加会报错的 2.查看logcat:要查看logcat的内容,要点一下设备 3.显示行号:在set ...

  9. 详解虚拟机(windows)下搭建SVN服务器

    安装前的准备 1.虚拟机的用户名最好是英文 2.严格按照步骤做,否则有可能不成功 3.如果安装失败,在虚拟机下的控制板完全下载VisualSVN-Server-2.7.7,重新安装 软件下载地址: h ...

  10. sdl2-2.04 读取位图并显示

    // sdl2_win32.cpp : Defines the entry point for the console application.//// 假定SDL的库文件和头文件和VC的工程文件在一 ...