堆优化dijkstra过样例但爆零求助
查看原帖
堆优化dijkstra过样例但爆零求助
376467
QDHSLGYYJK楼主2020/11/3 14:04
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct node{
	int d,y;
}tmp;
bool operator <(const node &a,const node &b){
	return a.d>b.d;
}
priority_queue <node> q;
const int N=1e5+5,M=2e5+5; 
int v[M],e[M],nxt[M],h[N],d[N],tot;
bool b[N];
void add(int x,int y,int z);
void dijkstra(int s);
int main(){
	int n,m,s;
	scanf("%d%d%d",&n,&m,&s);
	for (int i=1;i<=n;++i){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	dijkstra(s);
	for (int i=1;i<=n;++i)
		printf("%d ",d[i]);
	return 0;
}
inline void add(int x,int y,int z){
	v[++tot]=y;
	e[tot]=z;
	nxt[tot]=h[x];
	h[x]=tot;
}
inline void dijkstra(int s){
	memset(d,0x3f,sizeof(d));
	d[s]=0;
	tmp.d=0;
	tmp.y=s;
	q.push(tmp);
	while (q.size()){
		int x=q.top().y;
		q.pop();
		if (b[x])
			continue;
		b[x]=1;
		for (int i=h[x];i;i=nxt[i]){
			int y=v[i],z=e[i];
			if (d[y]>d[x]+z){
				d[y]=d[x]+z;
				if (!b[y]){
					tmp.d=d[y];
					tmp.y=y;
					q.push(tmp);
				}
			}
		}
	}
}
2020/11/3 14:04
加载中...