题意不在重复,对比堆优化和没优化的
速度碾压
优化思路在叙述一遍:
整体上差别还是很大的因为堆优化用了结构体存边(模拟邻接表(但性能比不过链式前向星)) 而一般是用邻接矩阵存图(这个也能用邻接矩阵,不过太慢了,数据大的话还是用边吧) ,然后是就是pair自定义了大小也就懒得再开结构体了
还一个特别的点就是更新点时没办法去掉老的dis所以 就标记每次更新点的值 下次看它是不是一直都是这个值 是表示这个是此时的最佳点,不是表示这个点已经用过了跳过
ac代码:
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; int dis[200]; int main(){ int n,m; while(cin>>n>>m&&(n||m)){ vector<P>G[200]; for(int i=0;i<m;i++){ int x,y,cost; cin>>x>>y>>cost; G[x].push_back(P(cost,y)); G[y].push_back(P(cost,x)); } memset(dis,0x3f3f3f3f,sizeof dis); dis[1]=0; priority_queue<P,vector<P>,greater<P> > que;//pair 自定义大小按first尾第一关键字 second为第二关键字 que.push(P(0,1)); while(!que.empty()){ P p=que.top(); que.pop(); int now=p.second; if(dis[now]<p.first) continue; for(int i=0;i<G[now].size();i++){ P e=G[now][i]; if(dis[e.second]>dis[now]+e.first){ dis[e.second]=dis[now]+e.first; que.push(P(dis[e.second],e.second)); } } } cout<<dis[n]<<endl; } }