原题链接:蓝桥杯2022年第十三届决赛真题-出差
解题思路:就单源朴素dijkstra算法,时间复杂度O(n^2 + m)本题数据能直接过,如果数据卡严一点就用堆优化,时间复杂度就是O(mlogn)
注意事项:注意当n = 1的时候加个特判
参考代码:
#include <bits/stdc++.h> #define int long long #define pii pair<int,int> #define fi first #define se second #define endl "\n" #define pb push_back #define getl(s) getline(cin,s) #define max(a,b) a > b ? a : b #define min(a,b) a < b ? a : b #define abs(a) a > 0 ? a : -a #define lowbit(a) a & -a using namespace std; const int N = 1e3 + 5; const int inf = 2e9 + 5; int n,m,w[N][N],dis[N],rest[N]; bool st[N]; int find() { int site = 0,mindis = inf; for(int i = 1;i <= n;i++) { if(!st[i] && dis[i] < mindis) { site = i; mindis = dis[i]; } } return site; } int dijkstra() { for(int i = 2;i <= n;i++) dis[i] = w[1][i] + rest[i]; dis[1] = 0; st[1] = true; int now = find(); while(now) { for(int i = 2;i <= n;i++) { dis[i] = min(dis[i], dis[now] + w[i][now] + rest[i]); } st[now] = true; now = find(); } return dis[n] - rest[n]; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); memset(st,false,sizeof(st)); cin>>n>>m; if(n == 1) { cout<<0<<endl; return 0; } for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) w[i][j] = inf; dis[i] = inf; w[i][i] = 0; } for(int i = 1;i <= n;i++) cin>>rest[i]; while(m--) { int x,y,v;cin>>x>>y>>v; w[x][y] = v; w[y][x] = v; } cout<<dijkstra(); return 0; }
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复