(玄关)16pts求条
查看原帖
(玄关)16pts求条
1029122
Fish_redflying楼主2024/10/8 23:10

自认为代码大部分没问题,但只拿16分。

使用堆优化的迪杰特斯拉。

#include<bits/stdc++.h>
#define max_size 1145144
using namespace std;
struct Edge {
	int to,nxt,dis;//链式前向星
} edge[max_size];
struct node {
	int dis,pos;
	bool operator<(const node &other) const {
		return other.dis<dis;
	}
};
int head[max_size];
int cnt;
int n,m,s,u,v,w;
int Dis[max_size],vis[max_size];
int pos,dis,child;
node tmp;

void add(int u,int v,int w) {
	cnt++;
	edge[cnt].nxt=head[u];
	edge[cnt].dis=w;
	edge[cnt].to=v;
	head[u]=cnt;
}//添加边

std::priority_queue<node> q;


void Dijkstra() {
	q.push({0,s});
	while(!q.empty()) {
		tmp=q.top(),q.pop();
		pos=tmp.pos,dis=tmp.dis;
		if (vis[pos]) continue;
		vis[pos]=1;
		//cout<<pos<<endl;
		for(int i=head[pos];i!=0;i=edge[i].nxt) {
			child=edge[i].to;
			//cout<<Dis[child]<<endl;
			if (Dis[child]>Dis[pos]+edge[i].dis) {
				Dis[child]=Dis[pos]+edge[i].dis;
				if (vis[child]==0) 
					q.push((node){edge[child].dis,child});
			}
		}
	}	
}

int main()
{
	scanf("%d%d%d",&n,&m,&s);
	memset(Dis,0x3f,sizeof(Dis));
	for(int i=1;i<=m;i++) {
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	Dis[s]=0;
	Dijkstra();
	for(int i=1;i<=n;i++) 
		printf("%d ",Dis[i]);
	return 0;
}




2024/10/8 23:10
加载中...