zoukankan      html  css  js  c++  java
  • Dijkstra

    pre.

    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int maxn=1e6+10;
    struct Edge{int u,v,w;}edge[2*maxn];
    int head[maxn],cnt;
    inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
    int dis[maxn];
    int n,m,s,u,v,w;
    inline void dijkstra(int s)
    {
    //    memset(dis,0x7f,sizeof(dis));
        for(int i=1;i<=n;i++)dis[i]=2147483647;
        priority_queue<pair<int,int> > q;//pair<dis,point>
        q.push(make_pair(0,s)),dis[s]=0;
        while(!q.empty())
        {
            pair cur=q.front(),q.pop();
            for(int i=cur.second,;i;i=edge[i].u)
            {
                int v=edge[i].v;
                if(dis[v]>dis[cur]+edge[i].w)
                    dis[v]=dis[cur]+edge[i].w,q.push(make_pair(dis[cur]+edge[i].w,v));
            }
        }
        for(int i=1;i<=n;i++)
            printf("%d ",dis[i]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        dijkstra(s);
        return 0;
    }
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int maxn=1e6+10;
    struct Edge{int u,v,w;}edge[2*maxn];
    int head[maxn],cnt;
    inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
    int dis[maxn];
    int n,m,s,u,v,w;
    inline void dijkstra(int s)
    {
    //    memset(dis,0x7f,sizeof(dis));
        for(int i=1;i<=n;i++)dis[i]=2147483647;
        priority_queue<pair<int,int> > q;//pair<dis,point>
        q.push(make_pair(0,s)),dis[s]=0;
        while(!q.empty())
        {
            pair<int,int>cur=q.top();q.pop();
            for(int i=cur.second;i;i=edge[i].u)
            {
                int v=edge[i].v;
                if(dis[v]>dis[cur.second]+edge[i].w)
                    dis[v]=dis[cur.second]+edge[i].w,q.push(make_pair(dis[cur.second]+edge[i].w,v));
            }
        }
        for(int i=1;i<=n;i++)
            printf("%d ",dis[i]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        dijkstra(s);
        return 0;
    }

    上面的代码是信息课上随手写的,当然是不过了,连样例都不过。

    重写一份。

    是忘记写head了。

    堆优化Dijkstra:

    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int maxn=1e6+10;
    struct Edge{int u,v,w;}edge[2*maxn];
    int head[maxn],cnt;
    inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
    int n,m,s,u,v,w;
    int dis[maxn],vis[maxn];
    inline void dijkstra(int s)
    {
        fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0);
        typedef pair<int,int> sta;
        priority_queue<sta,vector<sta>,greater<sta> > q;
        q.push((sta){0,s}),dis[s]=0;
        while(!q.empty())
        {
            sta cur=q.top();vis[cur.second]=0,q.pop();
            for(int i=head[cur.second];i;i=edge[i].u)
            {
                int v=edge[i].v;
                if(dis[v]>dis[cur.second]+edge[i].w)
                {
                    dis[v]=dis[cur.second]+edge[i].w;
                    if(!vis[v])vis[v]=1,q.push((sta){dis[v],v});
                }
            }
        }
        for(int i=1;i<=n;i++)printf("%d ",dis[i]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0;i<m;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w);
        dijkstra(s);
        return 0;
    }
    dijkstra
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define maxn 1000001
    using namespace std;
    struct Edge{int u,v,w;}edge[2*maxn];
    int head[maxn],cnt;
    int n,m,s,u,v,w;
    int vis[maxn],dis[maxn],cur,nxt;
    inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;}
    inline void spfa(int u)
    {
        queue<int>q;
        fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0),dis[u]=0,vis[u]=true,q.push(u);
        while(!q.empty())
        {
            cur=q.front(),vis[cur]=0,q.pop();
            for(int i=head[cur]; i; i=edge[i].u)
            {
                int v=edge[i].v;
                if(dis[v]>dis[cur]+edge[i].w)
                {
                    dis[v]=dis[cur]+edge[i].w;
                    if(!vis[v])vis[v]=1,q.push(v);
                }
            }
        }
        for(int i=1;i<=m;i++)printf("%d ",dis[i]);
    }
    int main()
    {
        scanf("%d%d%d",&m,&n,&s);
        for(int i=0; i<n; i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w);
        spfa(s);
        return 0;
    }
    spfa

    速度差不多,代码量也差不多。做个测试。

  • 相关阅读:
    为Mac Terminal设置代理
    Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
    vue.js环境搭建
    nodejs实现的简单接口
    Runtime
    iOS -- 神战
    前端视频
    iOS-- 重要的链接
    Oracle 11g R2安装手册(图文教程)For Windows
    undo_retention:确定最优的撤销保留时间
  • 原文地址:https://www.cnblogs.com/TheRoadToAu/p/7871162.html
Copyright © 2011-2022 走看看