为什么不能通过这题?
(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;
}
首先把 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} );
。大概就过了。
你是一个点都没过吗?
– 桜川景和 1年前