看到大家都写了那么多篇题解,本菜鸡瑟瑟发抖
于是乎我来水博客了,我相信自己一定能水到和任艾茜一样多的题解
好了切正题
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; int n,m,x,y,z; int dis[1003],g[1003][1003],vis[1003]; int main() { //dijkstra cin>>n>>m; for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++)g[i][j] = 1000000000; //i到j点间的距离被赋值为一个巨大的数 for(int i = 1;i <= m;i++){ cin>>x>>y>>z;//输入x到y的权值为z g[x][y] = min(g[x][y],z); } for(int i = 1;i <= n;i++)dis[i] = 1000000000;//让这个点到第i个点的距离均设为一个巨大的数 dis[1] = 0;//到自身的距离初始化为0 for(int i = 1;i <= n;i++)vis[i] = 0;//将所有的点都设为没被访问过的 for(int i = 1;i <= n;i++){ int t = -1; for(int j = 1;j <= n;j++) if(vis[j] == 0 && (t == -1 || dis[j] < dis[t])) t = j;//如果这个点之前没被访问过,并且距离上一个访问的点距离最小,则这个点为下一个将被访问的点 vis[t] = 1;//把这个点设置为已访问过 for(int j = 1;j <= n;j++) if(vis[j] == 0) dis[j] = min(dis[j],dis[t] + g[t][j]);//如果这个点没被访问过,则求出经过那个被访问的点之后起点到第 j个点的距离 //松弛操作 } for(int i = 1;i <= n;i++) printf("%d\n",dis[i]);//输出每个点到起点的距离 } //至于为什么不能有负边权呢?那是因为这个算法只能看到当前这一步中离被访问点最近的点,如果加上了负边权,那么下一步中含负边权的情况下就有可能会比按照这种垃圾算法算出的最小值小
好了我去吃饭了,再见
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步