7043
題目內容:
利用邻接表实现无向图的广度优先遍历
先输入两个整数(m,n)(分别表示待创建的图顶点数和边数),之后是m个顶点的信息,再之后是n 条边。
输出格式见示例
输入输出说明:
输入:
12 16
1 2 3 4 5 6 7 8 9 10 11 12
1 4
1 2
1 3
1 12
4 5
2 3
3 5
3 7
5 7
3 8
9 12
9 10
10 12
9 11
11 6
6 8
输出:
v1 v12 v3 v2 v4 v10 v9 v8 v7 v5 v11 v6
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
typedef struct ArcNode{
int adjvex;
ArcNode *netarc;
}ArcNode;
struct Vnode{
int data;
ArcNode *firstarc;
}Vnode,AdjList[MAXN];
int n,m;
int locate(int x){
for(int i = 1; i <= n; i++)
if(AdjList[i].data == x)
return i;
return -1;
}
void add_edge(int u , int v){
//连边
int pos_u = locate(u), pos_v = locate(v);
if(u == -1 || v == -1) return;
ArcNode *tmp = new ArcNode;
tmp->adjvex = pos_v;//存放当前节点编号
tmp->netarc = AdjList[pos_u].firstarc;
AdjList[pos_u].firstarc = tmp;
}
void creat_v(){
int x;
for(int i = 1; i <= n ; i++){
//建立点的信息
cin >> x;
AdjList[i].data = i;
AdjList[i].firstarc = NULL;
}
}
void creat_map(){
int u,v;
for(int i = 1; i <= m ; i++){
//建图
cin >> u >> v;
add_edge(u,v);
add_edge(v,u);
}
}
int que[MAXN];
bool vis[MAXN];//存的是编号,不是点的信息
void bfs(int fir){
int front = 0,rear = 0;
que[++rear] = fir;
vis[fir] = 1;
printf("v%d ",fir);
while(front != rear){
int u = que[++front];
for(ArcNode *i = AdjList[u].firstarc; i != NULL; i = i->netarc){
int v = i->adjvex;
if(vis[v]) continue;
vis[v] = 1;
que[++rear] = v;
printf("v%d ",v);
}
}
}
int main()
{
cin >> n >> m;
creat_v();
creat_map();
memset(vis,0,sizeof(vis));
for(int i = 1;i <= n; i++){
if(vis[locate(i)] == 0)
bfs(locate(i));
}
return 0;
}
7039
題目內容:
试编写算法,请从键盘输入数据,(1)建立一个有向图的邻接表存储。
(2)输出该邻接表。(3)输出深度优先遍历序列
先输入两个整数(m,n)(分别表示待创建的图顶点数和边数),之后是m个顶点的信息,再之后是n 条边。
输入输出说明:
输入数据:
6 6
1 2 3 4 5 6
1 2
1 3
2 4
3 4
4 5
3 6
输出:
1:3 2
2:4
3:6 4
4:5
5:
6:
1 3 6 4 5 2
#include <iostream>
using namespace std;
#define MaxVexNum 100//顶点的最大个数
typedef char VerTexData;//顶点数据类型