P5318 【深基18.例3】查找文献题解(链式前向星)

P5318 【深基18.例3】查找文献题解

用head记录这一起点的最后一条边,
next记录这一起点的上一条边。
注意要按照参考文献的倒叙排序(要按顺序看,而链式前向星是逆着来的,也就是为什么最简单的zhima1182是请按输入顺序倒序输出每个顶点以及所连的终点以及权值。

#include 
using namespace std;
struct {//这一个struct是模板!建议copy!
	struct {
		int to;
		int next;
	} edge[1000005];
	int head[100005];
	int cnt;
	void clear() {//清空
		memset(head, -1, sizeof head);
		memset(edge, 0, sizeof edge);
		cnt = 0;
	}
	void add(int x, int y) {
		edge[cnt].to = y;
		edge[cnt].next = head[x];
		head[x] = cnt++;
	}
} Map_Edge;
int n, m;
struct input {
	int x,y;
} in[1000005];
bool cmp(input a, input b) {
	return a.y > b.y;
}
bool vis[100005];
void dfs(int x) {
	cout << x << ' ';
	vis[x] = true;
	for (int i = Map_Edge.head[x]; i != -1; i = Map_Edge.edge[i].next) {
		if(!vis[Map_Edge.edge[i].to]) {
			dfs(Map_Edge.edge[i].to);
		}
	}
}
void bfs() {
	queue<int>q;
	q.push(1);
	vis[1] = true;
	cout << 1 << ' ';
	while(q.size()) {
		int temp = q.front();
		q.pop();
		for (int i = Map_Edge.head[temp]; i != -1; i = Map_Edge.edge[i].next) {
			if(!vis[Map_Edge.edge[i].to]) {
				cout << Map_Edge.edge[i].to << ' ';
				vis[Map_Edge.edge[i].to] = true;
				q.push(Map_Edge.edge[i].to); 
			}
		}
	}
}
int main() {
	Map_Edge.clear();//以防万一
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> in[i].x >> in[i].y;
	}
	sort(in + 1, in + m + 1, cmp);
	for(int i = 1; i <= m; i++) Map_Edge.add(in[i].x, in[i].y);
	dfs(1);
	cout << endl;
	memset(vis,false,sizeof vis);
	bfs();
	return 0;
}

完结撒花!!

你可能感兴趣的:(题解,深度优先,图论,算法,广度优先,图搜索算法)