【数据结构1-4】图的基本应用

 一、【P5318】查找文献(邻接表+DFS+BFS)

本题是图的遍历模板题,需要使用DFS和BFS遍历方法。

由于本题最多有1e5个顶点,如果采用邻接矩阵存储图的话需要4*1e10 Byte空间,显然会超内存,因此这里采用邻接表的方法存储。但需要注意的是,本题并没有使用广义上的邻接表,而是使用vector和array结合的方式存储,先用Edge数组存储边,并赋予每条边一个序号,然后用二维vector数组模拟邻接表,一维空间存储顶点的编号,二维空间存储该点所连接的边的序号。 

1.1 图的邻接表存储

8 9
1 2 //0号边(由于vector的下标是从0开始的,咱就“入乡随俗”,从0开始)
1 3 //1号边
1 4 //2号边
2 5 //3号边
2 6 //4号边
3 7 //5号边
4 7 //6号边
4 8 //7号边
7 8 //8号边

最后二维vector中的存储会如下所示:

0 1 2 //1号顶点连着0、1、2号边
3 4	//2号顶点连着3、4号边
5	//3号顶点连着5号边
6 7 //4号顶点连着6、7号边
	//5号顶点没有边
	//6号顶点没有边
8	//7号顶点连着8号边
	//8号顶点没有边

1.2 DFS深搜

void DFS(int cur)
{
	visit[cur] = 1;
	cout << cur << " ";
	for (int i = 0; i < arr[cur].size(); i++)
	{
		int dot = Edge[arr[cur][i]].v;
		if (!visit[dot])
			DFS(dot);
	}
}

1.3 BFS广搜

void BFS(int cur)
{
	queue q;
	q.push(cur);
	cout << cur << " ";
	visit[cur] = 1;
	while (!q.empty())
	{
		int f = q.front();
		for (int i = 0; i < arr[f].size(); i++)
		{
			int dot = Edge[arr[f][i]].v;
			if (!visit[dot])
			{
				q.push(dot);
				cout << dot << " ";
				visit[dot] = 1;
			}
		}
		q.pop();
	}
}

1.4 AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

vector arr[100005];
struct edge
{
	int u, v;
};
vector Edge;

bool visit[100005] = { 0 };
void DFS(int cur)
{
	visit[cur] = 1;
	cout << cur << " ";
	for (int i = 0; i < arr[cur].size(); i++)
	{
		int dot = Edge[arr[cur][i]].v;
		if (!visit[dot])
			DFS(dot);
	}
}

void BFS(int cur)
{
	queue q;
	q.push(cur);
	cout << cur << " ";
	visit[cur] = 1;
	while (!q.empty())
	{
		int f = q.front();
		for (int i = 0; i < arr[f].size(); i++)
		{
			int dot = Edge[arr[f][i]].v;
			if (!visit[dot])
			{
				q.push(dot);
				cout << dot << " ";
				visit[dot] = 1;
			}
		}
		q.pop();
	}
}

bool cmp(edge x, edge y)
{
	return x.v < y.v;
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int a, b;
		cin >> a >> b;
		edge s; s.u = a; s.v = b;
		Edge.push_back(s);
	}
	sort(Edge.begin(), Edge.end(), cmp); //容器无法用指针,只能用迭代器
	for (int i = 0; i < m; i++)
	{
		arr[Edge[i].u].push_back(i);
	}
	DFS(1);
	cout << endl;
	memset(visit, 0, sizeof(visit));
	BFS(1);

}


【P5318】查找文献(邻接表+DFS+BFS)

你可能感兴趣的:(数据结构)