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;
}


 

posted @ 2018-08-25 23:02  eason99  阅读(66)  评论(0编辑  收藏  举报