蒟蒻dijkstra70分求助
查看原帖
蒟蒻dijkstra70分求助
780320
xzy_sf楼主2023/7/27 10:51

在标准版那里都可以轻松过,这就只有70分

#include<bits/stdc++.h>
using namespace std;
int head[100010],cnt;
int n,m;
struct Edge{
	int v,w,nxt;
}edge[200010];
struct node{
	int u,val;
	bool operator < (const node &other) const
	{
		return val>other.val;
	}
};
int dis[100010];
bool vis[100010];
void dijkstra(int s)
{
	for(int i=1;i<=n;i++) dis[i]=2147483647;
	
	dis[s]=0;
	priority_queue<node> q;
	q.push((node){s,dis[s]});
	while(q.size())
	{
		int u=q.top().u;
		q.pop();
		if(vis[u]) continue;
		vis[u]=true;
		for(int j=head[u];j;j=edge[j].nxt)
		{
			int v=edge[j].v,w=edge[j].w;
			if(!vis[v]&&dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				q.push((node){v,dis[v]});
			}
		}
	}
}
void add(int u,int v,int w)
{
	cnt++;
	edge[cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
int main()
{
	int s,u,v,w;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dijkstra(s);
	for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
	return 0;
}

2023/7/27 10:51
加载中...