记录 代码:
#include<iostream>
using namespace std;
struct node{
int Id,Dis;
}Heap[1000005];
struct edge{
int Next,To,Dis;
}Edge[1000005];
int Dis[1000005],Vis[1000005],N,M,Start,Heap_Size,Head[1000005],Cnt;
void Add_Edge(int From,int To,int D){
Edge[++Cnt].Next=Head[From];
Edge[Cnt].To=To;
Edge[Cnt].Dis=D;
Head[From]=Cnt;
}
void Add_Heap(node X){
Heap[++Heap_Size]=X;
int i=Heap_Size;
while(Heap[i].Dis<Heap[i/2].Dis){swap(Heap[i],Heap[i/2]);i/=2;}
return;
}
void Del_Heap(int X){
Heap[X]=Heap[Heap_Size--];
while(X*2<Heap_Size){
int i=X*2;
if(Heap[i].Dis>Heap[i+1].Dis) i++;
if(Heap[i].Dis<Heap[X].Dis){swap(Heap[i],Heap[X]);X=i;}
else return;
}
}void Dijkstra(int S){
for(int i=0;i<=N;i++) Dis[i]=2100000000;
Dis[S]=0;
Add_Heap(node{S,0});
while(Heap_Size){
int l=Heap[1].Id;
Del_Heap(1);
if(Vis[l]) continue;
Vis[l]=1;
for(int i=Head[l];i;i=Edge[i].Next)
if(Dis[Edge[i].To]>Dis[l]+Edge[i].Dis){Dis[Edge[i].To]=Dis[l]+Edge[i].Dis;Add_Heap(node{Edge[i].To,Dis[Edge[i].To]});}
}
}
int main(){
cin>>N>>M>>Start;
for(int i=0,x,y,z;i<M;i++){cin>>x>>y>>z;Add_Edge(x,y,z);}
Dijkstra(Start);
for(int i=1;i<=N;i++) cout<<Dis[i]<<" ";
return 0;
}
手动堆
当我看到记录:
line 1 column 1951
麻烦大佬们找一下错