zoukankan      html  css  js  c++  java
  • 最短路+邻接表+最小堆的C++代码实现

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    #define MAX 110
    #define inf 100000000
    struct node
    {
        
    int dt;
        
    int id;
        
    bool operator<(node t)const
        {
            
    return dt < t.dt;
        }
    };
    priority_queue<node> q;
    struct edge
    {
        
    int v;
        
    int w;
        
    int next;
    } E[
    2 * MAX *MAX];
    int head[MAX];
    int num;
    int dist[MAX];
    bool vis[MAX];
    int n;
    int src, des;
    void init()
    {
        memset(head, -
    1sizeof(head));
        num = 
    0;
        
    int i;
        
    for(i = 1; i <= n; i++)
            dist[i] = inf;
        memset(vis, 
    0sizeof(vis));
    }
    void add(int s, int t, int w)
    {
        E[num].v = t;
        E[num].w = w;
        E[num].next = head[s];
        head[s] = num++;
        E[num].v = s;
        E[num].w = w;
        E[num].next = head[t];
        head[t] = num++;
    }
    void dijkstra()
    {
        
    while(!q.empty())q.pop();
        dist[src] = 
    0;
        node bg;
        bg.dt = 
    0;
        bg.id = src;
        q.push(bg);
        
    while(!q.empty())
        {
            node p = q.top();
            q.pop();
            
    int u = p.id;
            
    if(vis[u])continue;
            vis[u] = 
    true;
            
    int v;
            
    for(int i = head[u]; i != -1; i = E[i].next)
            {
                
    int v = E[i].v;
                
    if(dist[v] > dist[u] + E[i].w)
                {
                    dist[v] = dist[u] + E[i].w;
                    node tp;
                    tp.id = v;
                    tp.dt = dist[v];
                    q.push(tp);
                }
            }
        }
    }
    int main()
    {
        
    int m;
        
    while(scanf("%d%d", &n, &m) != EOF)
        {
            
    if(n == 0 && m == 0)
                
    break;
            init();
            
    int i;
            
    int s, t, w;
            
    for(i = 1; i <= m; i++)
            {
                scanf(
    "%d%d%d", &s, &t, &w);
                add(s, t, w);
                add(t, s, w);
            }
            scanf(
    "%d%d", &src, &des);
            dijkstra();
            cout << dist[des] << endl;
        }
    }
  • 相关阅读:
    WP7开发学习(3):在WP7中使用WCF+log4net 打印并输出日志文件(附源码)
    MongoDB开发学习(2)索引的基本操作
    C#批量添加水印
    获取某一时间戳的月份的开始时间戳和结束时间戳
    php判断一个字符串是否为日期格式
    正则表达式匹配括号引号内容
    PHP获取今日汽油价格接口
    ThinkPHP5 在Nginx环境下开启伪静态
    PHP格式化打印:JSON字符串|对象|数组
    php header ContentType出错
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215834.html
Copyright © 2011-2022 走看看