图中点的层次 题型:图论模板题

53 阅读1分钟

847. 图中点的层次 - AcWing题库

样例图:

image.png

1.我们发现从节点1走到节点4最短路径是1。

2.这是一个有向图,因此只需要在两个点之间加1条边即可。

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 1e5 + 10;
int h[N];  //存储头节点
int ne[N]; //下一个节点的指针
int e[N];  //边值
int idx;   //地址
int st[N]; //打标记防止一个节点走多次
int dist[N]; //距离数组



//邻接表存图
void add(int a, int b) { //在a,b两个点之间建一条边
	e[idx] = b; //把值赋给e
	ne[idx] = h[a]; //头指针指向下一个节点
	h[a] = idx++;  //头指针移动到下个节点
}


void bfs() {
	memset(dist, 0x3f, sizeof(dist)); //初始化每个节点都为没走过

	dist[1] = 0; //初始节点到初始节点的距离为0

	queue<int>q;
	q.push(1);  //加入初始节点
	st[1] = 1;  //初始节点标记为走过


	while (q.size()) {
		int t = q.front();
		q.pop();

		for (int i = h[t]; i != -1; i = ne[i]) { //从头节点开始往下遍历,直达走到空为止
			int j = e[i];


			if (!st[j]) { //如果没有遍历过
				dist[j] = dist[t] + 1; //更新一下距离
				q.push(j);         //当前点加入队列
				st[j] = 1;         //当前点标记为走过
			}
		}
	}
}


int main() {
	cin >> n >> m;

	memset(h, -1, sizeof h); //初始化所以头节点

	//建立m条边
	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		add(a, b);
	}

	bfs();


	if (dist[n] == 0x3f3f3f3f) { //如果距离没有变化说明走不到终点
		cout << -1;             //输出-1即可
	} else {
		cout << dist[n];        //否则就输出最短距离
	}

	return 0;
}