邻接表的使用
邻接表使用在什么时候呢?
想了想,觉得应该用来存储树。
还是来看一个例子吧。
题目:在一棵根树上,Alice和Bob分别在其中某些结点上有一些大石头。
现在Alice和Bob轮流移动属于自己的石头,移动的规则是这样的,
选择某个结点上的一块石头,将石头移到该结点的父结点,当然,
位于根结点的石头是不可移动的,因为根结点没有父结点。Alice
先移动,当一方没有石头可移动的时候就输了。
题解:只需计算每个石头的移动次数,即所在结点在根树中的深度即可。
现在我们已知的是根结点为0,那么我们我们可以用邻接表来存储,
可以从0号结点对远向图进行遍历,可采用深度优先或广度优先
来做。
深度优先代码:

#include<stdio.h> #include<string.h> #define MAXN 10 int n, m1, m2; int degree[MAXN]; int list[MAXN][MAXN]; int dep[MAXN]; void DFS(int f, int u, int d){ dep[u] = d; for(int i=0; i<degree[u]; i++){ int v = list[u][i]; if(v==f) continue; DFS(u, v, d+1); } } int main(){ while(scanf("%d%d%d", &n, &m1, &m2)==3){ memset(degree, 0, sizeof(degree)); for(int i=1, x, y; i<n; i++){ scanf("%d%d", &x, &y); list[x][degree[x]++] = y; list[y][degree[y]++] = x; } DFS(-1, 0, 0); int f1, f2, u; f1 = f2 = 0; for(int i=0; i<m1; i++){ scanf("%d", &u); f1+=dep[u]; } for(int i=0; i<m2; i++){ scanf("%d", &u); f2+=dep[u]; } if(f1<=f2) printf("Bob\n"); else printf("Alice\n"); } }
广度优先代码:

#include<stdio.h> #include<string.h> #include<queue> #include<iostream> using namespace std; #define MAXN 10 int n, m1, m2; int degree[MAXN]; int list[MAXN][MAXN]; int dep[MAXN]; void BFS(){ queue<int> q; q.push(0); memset(dep, 0, sizeof(dep)); while(!q.empty()){ int u = q.front(); q.pop(); for(int i=0; i<degree[u]; i++){ int v = list[u][i]; if(v==0) continue; if(dep[v]!=0) continue; q.push(v); dep[v] = dep[u]+1; } } } int main(){ while(scanf("%d%d%d", &n, &m1, &m2)==3){ memset(degree, 0, sizeof(degree)); for(int i=1, x, y; i<n; i++){ scanf("%d%d", &x, &y); list[x][degree[x]++] = y; list[y][degree[y]++] = x; } BFS(); int f1, f2, u; f1 = f2 = 0; for(int i=0; i<m1; i++){ scanf("%d", &u); f1+=dep[u]; } for(int i=0; i<m2; i++){ scanf("%d", &u); f2+=dep[u]; } if(f1<=f2) printf("Bob\n"); else printf("Alice\n"); } }
#include<stdio.h> #include<string.h> #include<queue> #include<iostream> using namespace std; #define MAXN 10 int n, m1, m2; int degree[MAXN]; int list[MAXN][MAXN]; int dep[MAXN]; void BFS(){ queue<int> q; q.push(0); memset(dep, 0, sizeof(dep)); while(!q.empty()){ int u = q.front(); q.pop(); for(int i=0; i<degree[u]; i++){ int v = list[u][i]; if(dep[v]!=0) continue; q.push(v); dep[v] = dep[u]+1; } } } int main(){ while(scanf("%d%d%d", &n, &m1, &m2)==3){ memset(degree, 0, sizeof(degree)); for(int i=1, x, y; i<n; i++){ scanf("%d%d", &x, &y); list[x][degree[x]++] = y; list[y][degree[y]++] = x; } BFS(); int f1, f2, u; f1 = f2 = 0; for(int i=0; i<m1; i++){ scanf("%d", &u); f1+=dep[u]; } for(int i=0; i<m2; i++){ scanf("%d", &u); f2+=dep[u]; } if(f1<=f2) printf("Bob\n"); else printf("Alice\n"); } }
posted on 2012-05-04 15:45 More study needed. 阅读(313) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架