社区讨论

迪特杰斯纳代码问题

灌水区参与者 7已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
15 条
当前快照
1 份
快照标识符
@m2hs3bhw
此快照首次捕获于
2024/10/21 00:04
去年
此快照最后确认于
2025/11/04 23:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int N=1000000+7;
const int M=2000000+7;
inline int read(){
	int x=0,f=0;char ch;
	while(!isdigit(ch=getchar()))if(ch=='-') f=1;
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
priority_queue<pii,vector<pii>,greater<pii>> q;
int to[M<<1],head[N],neext[M<<1],dis[N],ans[N];
int n,m,tot;

inline void add(int u,int v){
	to[++tot]=u;
	neext[tot]=head[v];
	head[v]=tot;
}

void dij(int u){
	memset(dis,INF,sizeof(dis));
	ans[u]=1;
	q.push(make_pair(dis[u]=0,u));
	while(!q.empty()){
		int d=q.top().first,x=q.top().second;q.pop();
		if(d!=dis[x]) continue;
		for(register int j=head[x];j;j=neext[j]){
			int y=to[j];
			if(dis[y]>dis[x]+1){
				dis[y]=dis[x]+1;
				ans[y]=ans[x];
				q.push(make_pair(dis[y],y));
			}
			else if(dis[y]==dis[x]+1) ans[y]=(ans[x]+ans[y])%100003;
		}
	}
}
int main( ){
	n=read();
	m=read();
	for(register int i=1;i<=m;++i){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	dij(1);
	for(register int i=1;i<=n;++i) printf("%d\n",ans[i]);
}
rt,这是一个迪特杰斯纳的最短路代码,想问一下这一行代码为什么这么写:
CPP
if(d!=dis[x]) continue;

回复

15 条回复,欢迎继续交流。

正在加载回复...