算法基础之Dijkstra求最短路 II

算法基础之Dijkstra求最短路 II

  • 核心思想:Dijkstra算法

    •   #include
        #include
        #include
        #include
        using namespace std;
        typedef pair<int,int> PII;
        
        const int N=1000010;  //数据是十五万 方便所以写成一百万
        
        int h[N],e[N],w[N],ne[N],idx,d[N];  //w是权值
        int n,m;
        bool st[N];
        
        void add(int a, int b, int c)
        {
            e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
        }
        
        int dijkstra(){
            memset(d, 0x3f, sizeof d);  //d距离初始化为无穷大 因为要找最小距离
            d[1] = 0;
            priority_queue<PII, vector<PII>, greater<PII>> heap;  //小根堆
            heap.push({0, 1});  //first为距离 second为编号
            
            while(heap.size()){
                auto t = heap.top();
                heap.pop();
                
                int ver = t.second , dis = t.first;
                if(st[ver]) continue;  //ver为编号 因为可能重复 用st记录是否搜索过
                st[ver] = true;
                for(int i=h[ver];i!=-1;i = ne[i])  //找每条边
                { 
                    int j = e[i];  //指向的节点编号
                    if (d[j] > d[ver] + w[i])  //原来j到1的距离d[j] 与 新的d[ver] + w[i]比较
                    {
                        d[j] = d[ver] + w[i];  //保存小的
                        heap.push({d[j], j});  //加入堆 
                        //可能存在重复情况 但是用st数组标记后 就不会重复搜索同一个节点了
                    }
                }
            }
            if(d[n] == 0x3f3f3f3f) return -1;  //没改过 说明走不到
            return d[n];
        }
        
        int main(){
            cin>>n>>m;
            
            memset(h,-1,sizeof h);  //初始化邻接表
            while(m--)
            {
                int a,b,c;
                cin>>a>>b>>c;
                add(a,b,c);
            }
            
            cout<<dijkstra()<<endl;
            
            return 0;
        }
      

你可能感兴趣的:(算法,图论,c++,数据结构,深度优先)