如题。主要错误点:修改了堆中点优先级相对值,dijkspfa。
#include<bits/stdc++.h>
#define il inline
#define re register
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
struct ln{
int u,v,w,nxt;
}a[400010];
struct fk{
int a;
fk(int b){a=b;}
fk(){}
};
int dij[100010],lnsz,hd[100010],n,m,u,v,w,sor;
bool vis[100010];
void mrg(int u,int v,int w){
a[++lnsz].u=u;
a[lnsz].v=v;
a[lnsz].w=w;
a[lnsz].nxt=hd[u];
hd[u]=lnsz;
}
struct cmp{
bool operator () (int a,int b){
return dij[a]>dij[b];
}
};
priority_queue<int,vector<int>,cmp> q;
void dijk(int root){
dij[root]=0;vis[root]=1;
q.push(root);
while(!q.empty()){
int tp=q.top();q.pop();vis[tp]=0;
for(int i=hd[tp];i;i=a[i].nxt)
if(dij[a[i].v]>dij[tp]+a[i].w){
dij[a[i].v]=dij[tp]+a[i].w;
if(!vis[a[i].v]){
vis[a[i].v]=1;
q.push(a[i].v);
}
}
}
}
signed main(){
cin>>n>>m>>sor;
for(int i=0;i<m;i++){
cin>>u>>v>>w;
mrg(u,v,w);
}
for(int i=0;i<=n;i++)dij[i]=INF;
dijk(sor);
for(int i=1;i<=n;i++)
cout<<dij[i]<<' ';
cout<<endl;
return 0;
}