zoukankan      html  css  js  c++  java
  • Dijkstra+堆优化

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int inf=0x3f3f3f3f;
    
    int n,m,k=1;
    int head[30000+10];
    int vis[30000+10];
    int dis[30000+10];
    
    struct edge
    {
        int v,w,next;
    }e[300000+10];
    
    void adde(int u,int v,int w)
    {
        e[k].v=v;
        e[k].w=w;
        e[k].next=head[u];
        head[u]=k++;
    }
    
    void readdata()
    {
        memset(head,-1,sizeof(head));
        memset(dis,inf,sizeof(dis));
        int a,b,c;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            adde(a,b,c);
            //adde(b,a,c);
        }
    }
    
    void dijkstra()
    {
        typedef pair <int,int >pii;
        priority_queue<pii,vector<pii>,greater<pii> >q;
        dis[1]=0;
        q.push(make_pair(dis[1],1));
        while(!q.empty())
        {
            int u=q.top().second;
            q.pop();
            if(vis[u])continue;
            vis[u]=1;
            for(int i=head[u];i!=-1;i=e[i].next)
            {
                int v=e[i].v;
                if(dis[v]>dis[u]+e[i].w)
                {
                    dis[v]=dis[u]+e[i].w;
                    q.push(make_pair(dis[v],v));
                }
            }
        }
        printf("%d
    ",dis[n]);
    }
    
    void spfa()
    {
        queue<int >q;
        dis[1]=0;
        q.push(1);
        vis[1]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i!=-1;i=e[i].next)
            {
                int v=e[i].v;
                if(dis[v]>dis[u]+e[i].w)
                {
                    dis[v]=dis[u]+e[i].w;
                    if(!vis[v])
                    {
                        q.push(v);
                        vis[v]=1;
                    }
                }
            }
        }
        printf("%d
    ",dis[n]);
    }
    
    int main()
    {
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
        readdata();
        //dijkstra();
        spfa();
        return 0;
    }

    关于spfa,它死了。

  • 相关阅读:
    @@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的辨析
    Blue Jeans[poj3080]题解
    绿色通道题解
    后缀数组
    Power Strings[poj2406]题解
    KMP算法
    Life Forms[poj3294]题解
    STM32固件库文件编程结构思想的理解
    GPIO设置
    HTML_v2
  • 原文地址:https://www.cnblogs.com/719666a/p/9500804.html
Copyright © 2011-2022 走看看