邻接表的使用
邻接表使用在什么时候呢?
想了想,觉得应该用来存储树。
还是来看一个例子吧。
题目:在一棵根树上,Alice和Bob分别在其中某些结点上有一些大石头。
现在Alice和Bob轮流移动属于自己的石头,移动的规则是这样的,
选择某个结点上的一块石头,将石头移到该结点的父结点,当然,
位于根结点的石头是不可移动的,因为根结点没有父结点。Alice
先移动,当一方没有石头可移动的时候就输了。
题解:只需计算每个石头的移动次数,即所在结点在根树中的深度即可。
现在我们已知的是根结点为0,那么我们我们可以用邻接表来存储,
可以从0号结点对远向图进行遍历,可采用深度优先或广度优先
来做。
深度优先代码:
View Code
#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"); } }
广度优先代码:
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"); } }
posted on 2012-05-04 15:45 More study needed. 阅读(313) 评论(0) 编辑 收藏 举报