zoukankan      html  css  js  c++  java
  • 贪心算法Dijkstra

    迪杰斯特拉算法

    代码如下:

    #include <iostream>
    using namespace std;
    
    typedef struct Node
    {
        int shortdist;         //用于记录到节点的最短距离
        int flag;               //用作标志变量,表示借点已经加入到集合中
        int prev;               //节点的前驱结点
    } Node;
    
    void Dijkstra(int num,int startvertex,int map[][10],Node *vertex)
    {
        for(int i=0;i<num;i++)
        {
            vertex[i].shortdist=map[startvertex][i];
            if(i==startvertex)
                vertex[i].flag=true;                  //将节点加入结合
            else
                vertex[i].flag=false;                  //标记其余节点未被加入结合
    
            if(vertex[i].shortdist<100)
                vertex[i].prev=startvertex;                      //标记节点前驱
            else
                vertex[i].prev=-1;
        }
    
        for(int i=0;i<num-1;i++)
        {
            int temp=100;
            int findmin=-1;
            for(int j=0;j<num;j++)                //发现与当前起始节点关联的距离最短的节点
            if(vertex[j].flag==false&&vertex[j].shortdist<temp)
            {
                temp=vertex[j].shortdist;
                findmin=j;
            }
            if(findmin!=-1)
            vertex[findmin].flag=true;                  //将该距离最短节点加入到集合
    
            for(int j=0;j<num;j++)                 //利用新加入的节点更新最短距离
            if(vertex[j].flag==false&&(vertex[findmin].shortdist+map[findmin][j]<vertex[j].shortdist))
            {
                vertex[j].shortdist=vertex[findmin].shortdist+map[findmin][j];
                vertex[j].prev=findmin;
            }
    
        }
        cout<<"Result: "<<endl<<"Source:"<<startvertex+1<<endl;
            for(int i=0;i<num;i++)
            if(vertex[i].flag==true)
            {
                cout<<i+1<<" distance:"<<vertex[i].shortdist<<" path:";
                int prev=i;
                if(prev==startvertex)
                cout<<prev+1;
                while(prev!=startvertex)
                {
                    cout<<vertex[prev].prev+1<<" ";
                    prev=vertex[prev].prev;
                }
                cout<<endl;
            }
            else
            cout<<i+1<<" Can't reach!"<<endl;
            //cout<<endl;
    }
    
    int main()
    {
        int map[10][10],row,col;
        cin>>row>>col;
        if(row!=col)
        {
            cout<<"Wrong!"<<endl;
            return 0;
        }
        int num=row;
        Node *vertex=new Node[col];
        for(int i=0;i<num;i++)
            for(int j=0;j<num;j++)
                cin>>map[i][j];                   //节点间距离为0-99,100表示无穷远
        for(int startvertex=0;startvertex<num;startvertex++)
        Dijkstra(num,startvertex,map,vertex);
    }
    

      结果:

    态度决定高度,细节决定成败,
  • 相关阅读:
    C#根据html生成PDF
    Oracle 存储过程异常处理
    Oracle事务之一:锁和隔离
    跨域解决方案一:使用CORS实现跨域
    AJAX POST&跨域 解决方案
    使用 jQuery Deferred 和 Promise 创建响应式应用程序
    jQuery:多个AJAX/JSON请求对应单个回调并行加载
    解决td标签上的position:relative属性在各浏览器中的兼容性问题
    盘点8种CSS实现垂直居中水平居中的绝对定位居中技术
    JQuery-UI Dialog下使用服务器端按钮失效
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/3032099.html
Copyright © 2011-2022 走看看