• 最短路+邻接表+最小堆的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;
        }
    }
  • 相关阅读:
    布局页js文件问题
    sqlite如何更改表结构
    css各种样式
    layUI订单实现思路
    layUI使用总结
    easyui点击行内编辑,怎么获取行数据并赋值
    404
    PTA C语言作业
    python一行代码格式化日期
    校园网跨网段共享文件Samba+SSH
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215834.html
Copyright © 2020-2023  润新知