首页 新闻 会员 周边

这段Dijkstra有什么问题

0
悬赏园豆:20 [已解决问题] 解决于 2023-07-18 14:57

为什么不能通过这题?
(https://www.luogu.com.cn/problem/P4779)

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int head[100000],cnt=0;
int dis[1000000],vis[1000000]={0};
struct edge
{
	int v,w,next;
}e[1000000];
struct node
{
	int u,d;
	bool operator <(const node& rhs) const
	{
		return d>rhs.d;
	}
};
void addedge(int u,int v,int w)
{
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void dij()
{
	for(int i = 1;i<=n;i++) dis[i]=0x3f;
	priority_queue<node> Q;
	Q.push((node){s,0});
	dis[s]=0;
	while(!Q.empty())
	{
		node fr=Q.top(); Q.pop();
		int u=fr.u; int d=fr.d;
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].next)
		{
			int y = e[i].v;
            if(dis[y]>dis[u]+e[i].w )
            {
                dis[y]=dis[u]+e[i].w;
                if(!vis[y])
                {
                    Q.push((node){y, dis[y]} );
                }
            }
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&s); 
	for(int i = 1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		addedge(a,b,c);
	}
	dij();
	for(int i = 1;i<=n;i++)
	cout<<dis[i]<<" ";
	return 0;
}
全角的!与半角的!的主页 全角的!与半角的! | 初学一级 | 园豆:138
提问于:2023-07-18 09:57

你是一个点都没过吗?

桜川景和 9个月前
< >
分享
最佳答案
0

首先把 for(int i = 1;i<=n;i++) dis[i]=0x3f; 改成 for(int i = 1;i<=n;i++) dis[i]=0x7fffffff; ,然后把 Q.push((node){s,0}); 改成 Q.push((node){0,s});,最后把 Q.push((node){y, dis[y]} ); 改成 Q.push((node){-dis[y], y} );。大概就过了。

收获园豆:20
eggome | 菜鸟二级 |园豆:222 | 2023-07-18 11:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册