警示后人Wa on #5
查看原帖
警示后人Wa on #5
507405
正经的普通人楼主2023/8/15 15:35

如果你也像我一样dijkstra写错了的话()

#define LL long long
#define inf 0x3f3f3f3f3f3f3f3f
LL dis[maxn<<5];
priority_queue <pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > Q;//pair<LL,int>不能忘
int vis[maxn<<5];
void dij(){
	for (int i=1;i<=cnt;i++) dis[i]=inf;
	dis[me[s]]=0;
	Q.push(make_pair(dis[me[s]],me[s]));
	vis[me[s]]=1;
	while(!Q.empty()){
		int u=Q.top().second;
		Q.pop();//错误的
		for (int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				if(!vis[v]) Q.push(make_pair(dis[v],v)),vis[v]=1;//错误的
			}
		}
	}
	for (int i=1;i<=n;i++){
		if(dis[sp[i]]==inf) putchar('-'),putchar('1'),putchar(' ');
		else printf("%lld ",dis[sp[i]]);
	}
	return;
}

正确的

#define LL long long
#define inf 0x3f3f3f3f3f3f3f3f
int st;
LL dis[maxn<<5];
priority_queue <pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > Q;
int vis[maxn<<5];
void dij(){
	for (int i=1;i<=cnt;i++) dis[i]=inf;
	dis[me[s]]=0;
	Q.push(make_pair(dis[me[s]],me[s]));
	while(!Q.empty()){
		int u=Q.top().second;
		Q.pop();
		if(vis[u])continue;
		vis[u]=1;//正确的 
		for (int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				Q.push(make_pair(dis[v],v)); //正确的 
			}
		}
	}
	for (int i=1;i<=n;i++){
		if(dis[sp[i]]==inf) putchar('-'),putchar('1'),putchar(' ');
		else printf("%lld ",dis[sp[i]]);
	}
	return;
}
2023/8/15 15:35
加载中...