WA求助(心血来潮手打了堆,结果除了样例全WA了)
查看原帖
WA求助(心血来潮手打了堆,结果除了样例全WA了)
102665
咸咸咸鱼楼主2023/7/12 16:43
#include <cstdio>
using namespace std;
const int maxn=2e5+10;
struct edge{
	int u,v,w;
}e[maxn<<2];
int tail[maxn],cnt;
void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].u=tail[u];
	tail[u]=cnt;
}
struct Heap{
	int siz;
	struct node{
		int id,w;
	}h[maxn<<1];
	void swap(node a,node b){
		node c=a;
		a=b,b=c;
	}
	void push(int id,int w){
		siz++;
		h[siz].id=id,h[siz].w=w;
		int u=siz;
		while(u){
			int v=u>>1;
			if(h[u].w<h[v].w) swap(h[u],h[v]);
			else break;
			u=v;
		} 
	}
	void pop(){
		swap(h[1],h[siz]);
		siz--;
		int u=1;
		while((u<<1)<=siz){
			int v=u<<1;
			if(v+1<=siz && h[v].w>=h[v+1].w) v++;
			if(h[u].w>h[v].w) swap(h[u],h[v]);
			else break;
			u=v;
		}
	}
	bool empty(){
		if(siz<=0) return 1;
		else return 0;
	}
	int top(){
		return h[1].id;
	}
}q;
int n,m,s;
int dis[maxn],vis[maxn];
void Dij(int s){
	q.push(s,0);
	dis[s]=0;
	vis[s]=1;
	while(!q.empty()){
		int u=q.top();
		q.pop();
		vis[u]=1;
		for(int i=tail[u];i;i=e[i].u){
			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(v,dis[v]);
					vis[v]=1;
				}
			}
		}
		vis[u]=0;
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n;i++){
		dis[i]=1e9+114;
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	Dij(s);
	for(int i=1;i<=n;i++){
		printf("%d ",dis[i]);
	}
	return 0;
}
2023/7/12 16:43
加载中...