• Dijkstra单源最短路模板


    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 110
    #define inf 0x3f3f3f3f
    int n,m;
    struct edge
    {
        int u,v,w;
        edge(int uu=0,int vv=0,int ww=0)
        {
            u=uu;
            v=vv;
            w=ww;
        }
    };
    struct node
    {
        int d,u;
        node(int dd=0,int uu=0)
        {
            d=dd;
            u=uu;
        }
        friend bool operator <(const node&a,const node&b)
        {
            if(a.d==b.d)
                return a.u>b.u;
            return a.d>b.d;
        }
    };
    
    priority_queue<struct node>q;
    vector<struct edge>e;
    vector<int>g[maxn];
    bool vis[maxn];
    int dis[maxn];
    void init()
    {
        for(int i=0;i<n;i++)
            g[i].clear();
        e.clear();
    }
    void addedge(int u,int v,int w)
    {
        int len=e.size();
        for(int i=0;i<len;i++)//去重操作
        {
            if(e[i].u==u&&e[i].v==v)
            {
    
                if(e[i].w>w)
                    e[i].w=e[i^1].w=w;
                return ;
            }
        }
        e.push_back(edge(u,v,w));
        g[u].push_back(len);
        e.push_back(edge(v,u,w));
        g[v].push_back(len+1);
    }
    void dijkstra()
    {
        struct edge ed;
        for(int i=0;i<n;i++)
            dis[i]=inf;
        dis[0]=0;
        memset(vis,0,sizeof(vis));
        q.push(node(dis[0],0));
        while(!q.empty())
        {
            node x=q.top();
            int u=x.u;
            vis[u]=1;
            q.pop();
            for(int i=0;i<g[u].size();i++)
            {
                ed=e[g[u][i]];
                if(!vis[ed.v]&&dis[ed.v]>(dis[u]+ed.w))
                {
                    dis[ed.v]=dis[u]+ed.w;
                    q.push(node(dis[ed.v],ed.v));
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            if(n==0&&m==0) break;
            init();
            for(int i=0;i<m;i++)
            {
                int u,v,d;
                scanf("%d %d %d",&u,&v,&d);
                addedge(u,v,d);
            }
           // for(int i=0;i<e.size();i++)
                //cout<<i<<" th "<<" st:"<<e[i].u<<"  ed:"<<e[i].v<<"  weight:"<<e[i].w<<endl;
            dijkstra();
            for(int i=0;i<n;i++)
                cout<<dis[i]<<" ";
            cout<<endl;
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    5-1
    浅谈sql中的in与not in,exists与not exists的区别
    理解SQL SERVER中的分区表
    SQLSERVER SQL性能优化
    SQL Server Profiler使用方法
    SQL Server中的三种Join方式
    执行计划
    执行计划sql
    INSERT INTO SELECT
    设计模式学习笔记-单例模式
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754909.html
Copyright © 2020-2023  润新知