抄了一份深进的堆优化迪杰斯特拉
然后发现莫名其妙TLE了
检查一番发现原版代码的Dijkstra函数用int定义却没有写return,改过来就A了
但奇怪的是,我在没有检查出该问题的时候就去交了隔壁的标准版,但是AC了,到这里来就会直接TLE
是什么造成评测不一致的?
代码附上:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX 500010
const int inf = 2147483647;
int n,m,s,cnt;
int dis[MAX],h[MAX],to[MAX],nxt[MAX],val[MAX];
/*
n:节点数
m:边数
s:出发点
cnt:链式前向星计数
*/
bool vis[MAX];
void add(int a,int b,int c){ //链式前向星存图
to[++cnt]=b;
val[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
struct node{
int v,w;
friend bool operator <(node a,node b){
return a.w>b.w;
}
} tmp; //tmp仅用来插入队列
priority_queue<node>q; //优先队列
int dj(){
for(int i=1;i<=n;i++){
dis[i]=inf; //初始化
}
dis[s]=0; //s即为起始点
tmp.v = s, tmp.w=0; q.push(tmp);
while(!q.empty()){ //
int u=q.top().v;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=h[u];i;i=nxt[i]){
if(dis[to[i]]>(long long)dis[u]+val[i]){
dis[to[i]]=dis[u]+val[i];
tmp.w = dis[to[i]], tmp.v = to[i]; q.push(tmp);
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w);
}
dj();
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
}
话说深进里有好多错啊(