#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5;
const int inf=2147483647;
int cnt;
int n,m,start;
int dis[N+5];
int head[N+5],to[N+5],nxt[N+5],weight[N+5];
bool book[N+5];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
void add_edge(int u,int v,int w)
{
cnt++;
to[cnt]=v;
weight[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
}
main()
{
cin>>n>>m>>start;
for(int i=1;i<=n+5;i++)
dis[i]=inf;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add_edge(u,v,w);
}
dis[start]=0;
que.push(make_pair(0,start));
while(que.size())
{
int trans=que.top().second;
que.pop();
if(book[trans])
continue;
book[trans]=true;
// cout<<trans<<"\n";
for(int i=head[trans];i;i=nxt[i])
{
int need=dis[trans]+weight[i];
if(dis[to[i]]>need)
{
dis[to[i]]=need;
que.push(make_pair(dis[to[i]],to[i]));
}
}
}
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5;
const int inf=2147483647;
int cnt;
int n,m,start;
int dis[N+5];
int head[N+5],to[N+5],nxt[N+5],weight[N+5];
bool book[N+5];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
void add_edge(int u,int v,int w)
{
cnt++;
to[cnt]=v;
weight[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
}
void dijsktra()
{
priority_queue<int,vector<int>,greater<int> >que;
dis[start]=0;
que.push(start);
while(que.size())
{
int trans=que.top();
que.pop();
if(book[trans])
continue;
book[trans]=true;
for(int i=head[trans];i;i=nxt[i])
{
int need=dis[trans]+weight[i];
if(dis[to[i]]>need)
{
dis[to[i]]=need;
que.push(to[i]);
}
}
}
}
main()
{
cin>>n>>m>>start;
for(int i=1;i<=n+5;i++)
dis[i]=inf;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add_edge(u,v,w);
}
dijsktra();
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
这两份代码后面的是36分,但是似乎第一份代码中的队列似乎只用到了表示结点的值,没有用到前面的值。
为什么删掉这个没有用到的值会是答案发生偏差的?