题解 P1144 【最短路计数】

这道题用一次SPFA就可以过了。在求最短路的同时,对答案进行统计即可。


实现:

\(dis_i\)表示从1到\(i\)的最短路(实在还是不懂的话看程序吧)。

  1. 当\(dis_i>dis_j+1\)时,直接令\(ans_i=ans_j\)即可。
  2. 当\(dis_i=dis_j+1\)时,那么到\(i\)的路径就可以多加上\(j\)的路径,即\(ans_i=ans_i+ans_j\)。

代码:

#include <bits/stdc++.h>
using namespace std;
int n , m , p = 100003;
int ans[1000010] , dis[1000010];
bool vis[1000010];
vector<int> a[1000010];
queue<int> q;
void spfa(){
	q.push(1);
	ans[1] = 1;
	vis[1] = 1;
	dis[1] = 0;
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(int i = 0; i < a[x].size(); i++){
			int y = a[x][i];
			if(dis[y] > dis[x] + 1){
				dis[y] = dis[x] + 1;
				ans[y] = ans[x];
				if(!vis[y]){
					vis[y] = 1;
					q.push(y);
				}
			}else if(dis[y] == dis[x] + 1) ans[y] = (ans[y] + ans[x]) % p;
		}
		vis[x] = 0;	//出队列了就可以标记未走过了,因为我们要重复更新这个点直到最优 
	}
}
int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		int x , y;
		cin >> x >> y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	for(int i = 1; i <= n; i++) dis[i] = 0x7fffffff;
	spfa();
	for(int i = 1; i <= n; i++) cout << ans[i] << endl;
	return 0;
}

上一篇:括号生成~


下一篇:基础字符串算法复习笔记(待填坑)