稀疏图

mac2022-06-30  27

#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=100010; typedef pair<int,int> PII; int q[N],dist[N]; int h[N],e[N],ne[N],w[N],idx; int n,m; void add(int a, int b, int c) { e[idx]=b, w[idx]=c, ne[idx]=h[a], h[a]=idx++; } int dijkstra() { memset(dist, 0x3f, sizeof dist); dist[1]=0; //堆优化版优先队列 priority_queue <PII, vector<PII>, greater<PII>> heap;//greater小顶堆 heap.push({0,1});//first是距离,second是数字 while(heap.size()) { auto t=heap.top();//堆用的是top,队列用的是front heap.pop(); //利用t更新数据 int ver=t.second, distance=t.first; for(int i=h[ver];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>distance+w[i]) { dist[j]=distance+w[i]; heap.push({dist[j],j}); } } } if(dist[n]==0x3f3f3f3f) return -1; return dist[n]; } int main() { cin>>n>>m; memset(h, -1, sizeof h); while(m--) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } cout<<dijkstra()<<endl; return 0; }

 

最新回复(0)