本人优先队列优先队列按 点编号 排序AC
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int fst[maxn],nxt[maxn<<3],e[maxn<<3],val[maxn<<3],cnt;
void add(int x,int y,int z){
nxt[++cnt]=fst[x];
fst[x]=cnt;
e[cnt]=y;
val[cnt]=z;
}
int n,m;
int d[maxn];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x-1,y,-z);
}
for(int i=1;i<=n;i++){
add(i,i-1,1);
add(i-1,i,0);
}
memset(d,0x3f,sizeof(d));
d[0]=0;
q.push(make_pair(0,0));
while(!q.empty()){
int now=q.top().first,w=q.top().second;
q.pop();
if(w!=d[now]) continue;
for(int i=fst[now];i;i=nxt[i]){
int to=e[i],v=val[i];
if(d[now]+v<d[to]){
d[to]=d[now]+v;
q.push(make_pair(to,d[to]));
}
}
}
for(int i=1;i<=n;i++){
printf("%d ",d[i-1]-d[i]);
}
}
求求有dalao知道为什么吗??