RT,蒟蒻的堆优化 Dijkstra SPFA了,求助 QAQ
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
inline int getint()
{
char ch=getchar();long long w=0,f=1;
while(ch<'0' || ch>'9'){if(ch=='-')f=-f; ch=getchar();}
while(ch>='0' && ch<='9'){w=(w<<1)+(w<<3)+(ch^48); ch=getchar();}
return w*f;
}
int n,m,tot,start;
const int MAXN=500005;
struct Edge
{
int u,w,head,nxt;
}a[MAXN];
bool vis[MAXN];
struct Point
{
int dis,number;
bool operator < (const Point &a)const
{
return dis>a.dis;
}
}p[MAXN];
priority_queue<Point> q;
void add(int x,int y,int v)
{
tot++;
a[tot].u=y;
a[tot].w=v;
a[tot].nxt=a[x].head;
a[x].head=tot;
}
inline void Dijkstra(int start)
{
for(register int i=1;i<=n;i++) p[i].number=i;
for(register int i=1;i<=n;i++)
{
Point minn=q.top();q.pop();
int mini=minn.number;
for(register int j=a[mini].head;j;j=a[j].nxt)
{
p[a[j].u].dis=min(p[a[j].u].dis,p[mini].dis+a[j].w);
q.push(p[a[j].u]);
}
}
p[start].dis=0;
for(int i=1;i<=n;i++)
{
if(p[i].dis!=1000000000) cout<<p[i].dis<<" ";
else cout<<2147483647<<" ";
}
}
int main()
{
for(int i=1;i<MAXN-5;i++) p[i].dis=1000000000;
n=getint();m=getint();start=getint();
for(register int i=1;i<=m;i++)
{
int u,v,w;
u=getint();v=getint();w=getint();
add(u,v,w);
if(u==start) p[v].dis=w;
}
p[start].dis=0;
p[start].number=start;
q.push(p[start]);
Dijkstra(start);
return 0;
}