ZSTU OJ 3999 零基础学算法---邻接表
题目: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 零基础学算法---邻接表的更多相关文章
- 零基础学C#算法(零基础学算法——C#版)
今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...
- 零基础学python-5.2 数字表达式操作符
表达式是处理数字最主要的工具 a=1#常量 a=a+1#表达式 操作符 操作符 描写叙述 yield 生成 器函数发送协议 lambda args:expression 生成匿名函数 x if y e ...
- 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉
机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...
- 【雕爷学编程】MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏
配套 2.4寸LCD屏 ST7789驱动器芯片(24P 320X240) ST7789驱动器芯片2.4寸LCD屏(24P 320X240)主要参数 1. 模块名称:液晶显示模块2. 型号:KD024C ...
- 【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色
早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运 ...
- 零基础学Java第四节(字符串相关类)
本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...
- 《Windows编程零基础学》第零节
首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...
- 【视频】零基础学Android开发:蓝牙聊天室APP(四)
零基础学Android开发:蓝牙聊天室APP第四讲 4.1 ListView控件的使用 4.2 BaseAdapter具体解释 4.3 ListView分布与滚动事件 4.4 ListView事件监听 ...
- 【视频】零基础学Android开发:蓝牙聊天室APP(二)
零基础学Android开发:蓝牙聊天室APP第二讲 2.1 课程内容应用场景 2.2 Android UI设计 2.3 组件布局:LinearLayout和RelativeLayout 2.4 Tex ...
随机推荐
- Java 比较两日期相差天数
(版本1) publicstaticint getIntervalDays(Date fDate, Date oDate) { if (null == fDate || null == oDate) ...
- .net Web应用程序使用IIS调试
1.这种调试方式是区别于使用Visual Studio 自带的调试方式 2.点击[创建虚拟目录],成功
- R语言学习笔记之外部文件读取
在win32位的系统下,RODBC包内的函数是可以直接运行的,但在win64位的系统则不支持! 1.读取外部文件read.table()---csv,txt,excel 最基本函数是read.tabl ...
- python 10min系列之实现增删改查系统
woniu-cmdb 奇技淫巧--写配置文件生成增删改查系统 视频教程 项目主页跪求github给个star, 线上demo,此页面都是一个配置文件自动生成的 详细的文章介绍和实现原理分析会发布在我的 ...
- poj 2653 计算几何
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> ...
- QT 获取文件MD5值
/* 方法1 */ QFile theFile(fileNamePath); theFile.open(QIODevice::ReadOnly); QByteArray ba = QCryptogra ...
- Jsp、Servlet
1 forward.redirect forward 转发是服务器行为,浏览器根本不知道服务器发送的内容是从哪儿来,所以它的地址栏中还是原来的地址. redirect 重定向是客户端行为.redire ...
- poj 1386 Play on Words(有向图欧拉路+并查集)
题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指 ...
- Flex XML搜索、匹配
- <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx=" ...
- Flex TextInput的restrict属性应用
1,<mx:TextInput id="test_ti" width="160" maxChars="20" restrict=&qu ...