图的前向星表示在我的上一篇博客中已经介绍 图的前向星表示
首先定义数据结构
struct NODE
{
int to;
int next;
};
to表示指向节点,next表示从该节点出发的上一条边的位置。
依然用head[] 数组表示某节点出发的第一条边的位置。
代码如下
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 100;
const int maxm = 100;
int vis[maxm];
int bvis[maxm];
int head[maxn];
int n, m, nEdge; //n为顶点数,m为边数,nEdge为存储的边的数量
//如果边是双向的,那么存储的边的数量就是2m
struct NODE
{
int to;
int next;
};
NODE edge[maxm];
void addedges(int u, int v) //将边(u,v)添加进去
{
nEdge++;
edge[nEdge].next = head[u];
edge[nEdge].to = v;
head[u] = nEdge;
}
void foreach() //遍历边
{
int i, k;
for (i = 1; i <= n; i++)
{
for (k = head[i]; k != -1; k = edge[k].next)
{
cout << i << " " << edge[k].to << endl;
}
}
}
void Init()
{
nEdge = -1;
memset(head, 0xff, sizeof(head));
int u, v;
for (int i = 0; i<m; ++i)
{
cin >> u >> v;
addedges(u, v);
}
}
void dfs(int x)
{
int i;
vis[x] = true;
printf("%d\n", x);
for (i = head[x]; i != -1; i = edge[i].next)
{
if (!vis[edge[i].to])
{
dfs(edge[i].to);
}
}
}
void bfs(int x)
{
queue<int> que;
que.push(x);
bvis[x] = true;
int i, k;
while (!que.empty())
{
int x = que.front();
que.pop();
printf("%d\n", x);
for (k = head[x]; k != -1; k = edge[k].next)
{
if (!bvis[edge[k].to])
{
que.push(edge[k].to);
bvis[edge[k].to] = true;
}
}
}
}
int main()
{
cin >> n >> m;
Init();
foreach();
dfs(1);
bfs(1);
}