全WA,用的链式前向星
查看原帖
全WA,用的链式前向星
928972
ny_Dacong楼主2023/10/3 09:19

inque表示是否在队列中。

path每个点统计最短路的条数。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,t,y;
int Last[2000005],Next[2000005],End[1000005],Len[2000005],dis[1000005],path[1000005];
bool inque[1000005];
queue<int> que;
void spfa(int x){
	for(int i = 1; i <= n; i++){
		dis[i] = 99999999;
		inque[i] = 0;
		path[i] = 0;
	}
	path[x] = 1;
	que.push(x);
	inque[x] = 1;
	dis[x] = 0;
	while(!que.empty()){
		int tp = que.front();
		que.pop();
		inque[tp] = 0;
		t = Last[tp];
		while(t != 0){
			y = End[t];
			if(dis[x] + Len[t] == dis[y]){
				path[y] += path[x];
				path[y] %= 100003;
			}else{
				if(dis[x] + Len[t] < dis[y]){
					dis[y] = dis[x]+Len[t];
					path[y] = path[x];
					path[y] %= 100003;
					if(!inque[y]){
						inque[y] = 1;
						que.push(y);
					}
				}
			}
			t = Next[t];
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	//memset(Len,0x3f,sizeof(Len));
	int a,b;
	for(int i = 1; i <= m; i++){
		scanf("%d%d",&a,&b);
		End[i] = b;
		Len[i] = 1;
		Next[i] = Last[a];
		Last[a] = i;
	}
	spfa(1);
	for(int i = 1; i <= n; i++){
		printf("%d\n",path[i]);
	}
	return 0;
}

请大佬查错

2023/10/3 09:19
加载中...