邻接表的使用
2012-05-04 15:45
211 查看
邻接表使用在什么时候呢?
想了想,觉得应该用来存储树。
还是来看一个例子吧。
题目:在一棵根树上,Alice和Bob分别在其中某些结点上有一些大石头。
现在Alice和Bob轮流移动属于自己的石头,移动的规则是这样的,
选择某个结点上的一块石头,将石头移到该结点的父结点,当然,
位于根结点的石头是不可移动的,因为根结点没有父结点。Alice
先移动,当一方没有石头可移动的时候就输了。
题解:只需计算每个石头的移动次数,即所在结点在根树中的深度即可。
现在我们已知的是根结点为0,那么我们我们可以用邻接表来存储,
可以从0号结点对远向图进行遍历,可采用深度优先或广度优先
来做。
深度优先代码:
View Code
想了想,觉得应该用来存储树。
还是来看一个例子吧。
题目:在一棵根树上,Alice和Bob分别在其中某些结点上有一些大石头。
现在Alice和Bob轮流移动属于自己的石头,移动的规则是这样的,
选择某个结点上的一块石头,将石头移到该结点的父结点,当然,
位于根结点的石头是不可移动的,因为根结点没有父结点。Alice
先移动,当一方没有石头可移动的时候就输了。
题解:只需计算每个石头的移动次数,即所在结点在根树中的深度即可。
现在我们已知的是根结点为0,那么我们我们可以用邻接表来存储,
可以从0号结点对远向图进行遍历,可采用深度优先或广度优先
来做。
深度优先代码:
View Code
#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"); } }
相关文章推荐
- STL_稀疏图,树_使用vector邻接表存储
- Codeforces Round #287 (Div. 2) E bfs+记录最短路径(邻接表的使用
- 邻接表的使用及和vector的比較
- (hdu step 6.3.1)Strategic Game(求用最少顶点数把所有边都覆盖,使用的是邻接表)
- 图的遍历--使用邻接表作为存储结构的遍历(DFS、BFS)C语言
- 使用邻接表存储有向图模板
- 使用vector构造带权图的邻接表
- 使用邻接表实现基数排序
- 使用邻接表存图并遍历
- STL_稀疏图,树_使用vector邻接表存储
- Bellman算法优化使用邻接表C++实现
- 队列优化并使用邻接表存储的Bellman-Ford算法模板解决最短路径存在负权边问题
- 拓扑排序,使用邻接表来存储图
- java中使用邻接表返回json树(tree)
- STL_稀疏图,树_使用vector邻接表存储
- 使用数组来模拟邻接表存储图信息
- Diskstra-最短路径-使用数组来实现邻接表
- hdu(2544)——最短路(邻接表+bellman-ford使用队列优化)
- ACdream之使用vector和queue进行邻接表的广搜
- ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。