请各位大佬帮忙看看为什么dij RE了。
思路:堆优化的dij,pair中第一个int是顶点到 s 的距离的相反数,大根堆->小根堆。第二个int是顶点号
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1,maxm=2e5+1,Inf=0x3f3f3f3f;
priority_queue <pair<int,int> > q;
struct EDGE {
int w,v,next;
} e[maxm];
int head[maxn]={0},cnt=0,dis[maxn],vis[maxn],n,m,s;
void Adde(int u,int v,int w)
{
++cnt;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
void Dij()
{
memset(dis,Inf,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()) {
int tmp=q.top().second;
q.pop();
if(vis[tmp]==0) {
vis[tmp]=1;
for(int i=head[tmp]; i!=0; i=e[i].next) {
if(dis[e[i].v]>dis[tmp]+e[i].w) {
dis[e[i].v]=dis[tmp]+e[i].w;
q.push(make_pair(-dis[e[i].v],e[i].v));
}
}
}
}
return;
}
int main()
{
int u,v,w;
scanf("%d%d%d",&n,&m,&s);
for(int i=1; i<=m; ++i) {
scanf("%d%d%d",&u,&v,&w);
Adde(u,v,w);
}
Dij();
for(int i=1; i<=n; ++i) {
if(dis[i]==Inf) {
printf("%d",(1<<31)-1);
} else {
printf("%d ",dis[i]);
}
}
return 0;
}