如果你也像我一样dijkstra写错了的话()
#define LL long long
#define inf 0x3f3f3f3f3f3f3f3f
LL dis[maxn<<5];
priority_queue <pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > Q;//pair<LL,int>不能忘
int vis[maxn<<5];
void dij(){
for (int i=1;i<=cnt;i++) dis[i]=inf;
dis[me[s]]=0;
Q.push(make_pair(dis[me[s]],me[s]));
vis[me[s]]=1;
while(!Q.empty()){
int u=Q.top().second;
Q.pop();//错误的
for (int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]) Q.push(make_pair(dis[v],v)),vis[v]=1;//错误的
}
}
}
for (int i=1;i<=n;i++){
if(dis[sp[i]]==inf) putchar('-'),putchar('1'),putchar(' ');
else printf("%lld ",dis[sp[i]]);
}
return;
}
正确的
#define LL long long
#define inf 0x3f3f3f3f3f3f3f3f
int st;
LL dis[maxn<<5];
priority_queue <pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > Q;
int vis[maxn<<5];
void dij(){
for (int i=1;i<=cnt;i++) dis[i]=inf;
dis[me[s]]=0;
Q.push(make_pair(dis[me[s]],me[s]));
while(!Q.empty()){
int u=Q.top().second;
Q.pop();
if(vis[u])continue;
vis[u]=1;//正确的
for (int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
Q.push(make_pair(dis[v],v)); //正确的
}
}
}
for (int i=1;i<=n;i++){
if(dis[sp[i]]==inf) putchar('-'),putchar('1'),putchar(' ');
else printf("%lld ",dis[sp[i]]);
}
return;
}