zoukankan      html  css  js  c++  java
  • HDU 2544 最短路(模板题)

    求1到N的最短路径,模板题,以1为源点,用dijkstra算法(可以用优先级队列优化)

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdio.h>
    #include <string>
    #include <vector>
    #include <queue>
    
    using namespace std;
    const int maxn=0x3f3f3f3f;
    
    int road[110][110];//road[i][j]表示i与j的距离(这里指进过该条路的时间)
    int dis[110];//dis[i]表示i点到源点1的最短路径大小
    int vis[110];//vis[i]=1表示节点i已经求过到源点的单源最短路径
    vector<int> link[110];//link[i]表示i与哪些点连接
    int n,m;
    int a,b,c;
    
    struct Node{
        int u,dis;
    
        bool operator<(const Node tmp) const{
            return dis>tmp.dis;  //优先级序列默认的是最先取出的是“最大的”。
        }
          //如果按从小到大排,则优先级队列取最大的。
        //如果从大到小排,则优先级队列取最小的。
    };
    
    void dijkstra() {
        priority_queue<Node> q;
        Node tmp,a;
        memset(dis,maxn,sizeof(dis));
        memset(vis,0,sizeof(vis));
        dis[1]=0;
        a.dis=0;
        a.u=1;
        q.push(a);
        while(!q.empty()) {
            tmp=q.top();
            q.pop();
            int idx=tmp.u;
            vis[idx]=1;
            for(int k=0; k<link[idx].size(); k++) {
                int v=link[idx][k];
                if(v!=idx && !vis[v]) {
                    if(dis[idx]+road[idx][v]<dis[v]) {
                        dis[v]=dis[idx]+road[idx][v];
                        a.dis=dis[v];
                        a.u=v;
                        q.push(a);
                    }
                }
            }
        }
    
    }
    int main() {
        while(scanf("%d%d",&n,&m)!=EOF) {
            if(n==0 && m==0) {
                break;
            }
            U.clear();
            memset(road,0,sizeof(road));
            for(int i=0; i<=n; i++)
                link[i].clear();
            for(int i=0; i<m; i++) {
                scanf("%d%d%d",&a,&b,&c);
                road[a][b]=c;
                road[b][a]=c;
                link[a].push_back(b);
                link[b].push_back(a);
            }
            dijkstra();
            printf("%d
    ",dis[n]);
    
        }
        return 0;
    }
  • 相关阅读:
    线程池和进程池
    初识数据库
    线程q
    event事件
    死锁和递归锁
    信号量
    PythonStudy——线程中的几种消息队列
    PythonStudy——GIL Global Interpreter Lock 全局解释器锁
    PythonStudy——异步回调
    PythonStudy——日志模块 logging
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3280457.html
Copyright © 2011-2022 走看看