自认为代码大部分没问题,但只拿16分。
使用堆优化的迪杰特斯拉。
#include<bits/stdc++.h>
#define max_size 1145144
using namespace std;
struct Edge {
int to,nxt,dis;//链式前向星
} edge[max_size];
struct node {
int dis,pos;
bool operator<(const node &other) const {
return other.dis<dis;
}
};
int head[max_size];
int cnt;
int n,m,s,u,v,w;
int Dis[max_size],vis[max_size];
int pos,dis,child;
node tmp;
void add(int u,int v,int w) {
cnt++;
edge[cnt].nxt=head[u];
edge[cnt].dis=w;
edge[cnt].to=v;
head[u]=cnt;
}//添加边
std::priority_queue<node> q;
void Dijkstra() {
q.push({0,s});
while(!q.empty()) {
tmp=q.top(),q.pop();
pos=tmp.pos,dis=tmp.dis;
if (vis[pos]) continue;
vis[pos]=1;
//cout<<pos<<endl;
for(int i=head[pos];i!=0;i=edge[i].nxt) {
child=edge[i].to;
//cout<<Dis[child]<<endl;
if (Dis[child]>Dis[pos]+edge[i].dis) {
Dis[child]=Dis[pos]+edge[i].dis;
if (vis[child]==0)
q.push((node){edge[child].dis,child});
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
memset(Dis,0x3f,sizeof(Dis));
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
Dis[s]=0;
Dijkstra();
for(int i=1;i<=n;i++)
printf("%d ",Dis[i]);
return 0;
}