zoukankan      html  css  js  c++  java
  • dijkstra算法

    看到大家都写了那么多篇题解,本菜鸡瑟瑟发抖

    于是乎我来水博客了,我相信自己一定能水到和任艾茜一样多的题解

    好了切正题

    #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
    ",dis[i]);//输出每个点到起点的距离 
    }
    //至于为什么不能有负边权呢?那是因为这个算法只能看到当前这一步中离被访问点最近的点,如果加上了负边权,那么下一步中含负边权的情况下就有可能会比按照这种垃圾算法算出的最小值小 

    好了我去吃饭了,再见

  • 相关阅读:
    webIDE 第二篇博文
    前端第一天
    记昨天
    入职第四天
    入职第二天
    linux常用命令,自己总结
    一切从头开始
    在服务器上搭建SVN
    Dynamic CRM 365学习历程--JS
    Dynamic CRM 365学习历程--有关CRM的学习过程种需要注意的事项
  • 原文地址:https://www.cnblogs.com/yupeiqi/p/8822407.html
Copyright © 2011-2022 走看看