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;
        }
    }
  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)(转)
    第四章 禅坐和外相的修行
    第三章 生活就是我们的修行
    第二章 更正我们的知见
    第一章 明了佛陀的教导(宁静的森林水池)
    第二章 取其一半
    你的程序员是在努力工作还是在偷懒?
    给JavaScript初学者的24条最佳实践
    简单理解Socket
    oracle18c linux x86-64 install 杂记
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215834.html
Copyright © 2011-2022 走看看