//处理较大数据用堆优化 /* 3 3 1 2 2 2 3 1 1 3 4 */ //找到终点距离起点的最短距离 #include<iostream> #include<cstring> #include<queue> #include<vector> //堆优化用队列实现 using namespace std; typedef pair<int,int> PII; //初始化 const int N=10010; int he[N],e[N],ne[N],w[N],idx=0; //新增w存距离 bool st[N]; //标记走过的点 int dist[N],n,m; void add(int a,int b,int c) { e[idx]=b; w[idx]=c; ne[idx]=he[a]; he[a]=idx++; } int dijkstra() { memset(dist, 0x3f, sizeof dist); dist[1] = 0; priority_queue<PII, vector<PII>, greater<PII>> heap; heap.push({1,0}); //插入节点编号 和 距离 while(heap.size()) { auto t = heap.top(); heap.pop(); if (st[t.first])continue; st[t.first] = true; for (int i = he[t.first]; i != -1; i = ne[i]) { if (dist[e[i]] > dist[t.first] + w[i]) { //也可写成 dist[e[i]]>t.second+w[i] dist[e[i]] = dist[t.first] + w[i]; heap.push({e[i], dist[e[i]]}); } } } if (dist[n] == 0x3f) return -1; else return dist[n]; } int main(void) { memset(he,-1,sizeof he); cin>>n>>m; while(m--) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } int t=dijkstra(); cout<<t<<endl; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复