zoukankan      html  css  js  c++  java
  • [USACO09OCT]热浪Heat Wave

    最短路的蒻弱化版,借着练了一遍dij堆优化的板子,放一个dij的标程在这吧。(真心感觉dij比某个已死算法敲着简单)

    堆优化部分:

    struct node
    {
        int u,v;
        bool operator <(const node &b)const
        {
            return u>b.u;
        }
    };
    priority_queue<node>q;

    核心程序

    void dijkstra()
    {
        for(int i=0;i<=n;i++) dis[i]=inf;
        dis[s]=0;
        node k;
        k.u=0;
        k.v=s;
        q.push(k);
        while(!q.empty())
        {
            int k=q.top().v,d=q.top().u;        
            q.pop();
            if(dis[k]!=d) continue;
            for(int i=head[k];i;i=ed[i].nxt)
            {
                if(dis[ed[i].to]>dis[k]+ed[i].val)
                {
                    dis[ed[i].to]=dis[k]+ed[i].val;
                    node p;
                    p.v=ed[i].to;
                    p.u=dis[p.v];
                    q.push(p);
                }
            }
        }
    }

    完整代码(规定起止点的dij)

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #define maxn 100010
    #define inf 2120030207
    using namespace std;
    int head[maxn],dis[maxn],n,m,s,t,vis[maxn];
    struct noded
    {
        int nxt,to,val;
    }ed[maxn<<1];
    int cnt;
    void add(int x,int y,int z)
    {
        ed[++cnt].to=y;
        ed[cnt].nxt=head[x];
        head[x]=cnt;
        ed[cnt].val=z;
        swap(x,y);
        ed[++cnt].to=y;
        ed[cnt].nxt=head[x];
        head[x]=cnt;
        ed[cnt].val=z;
    }
    struct node
    {
        int u,v;
        bool operator <(const node &b)const
        {
            return u>b.u;
        }
    };
    priority_queue<node>q;
    void dijkstra()
    {
        for(int i=0;i<=n;i++) dis[i]=inf;
        dis[s]=0;
        node k;
        k.u=0;
        k.v=s;
        q.push(k);
        while(!q.empty())
        {
            int k=q.top().v,d=q.top().u;        
            q.pop();
            if(dis[k]!=d) continue;
            for(int i=head[k];i;i=ed[i].nxt)
            {
                if(dis[ed[i].to]>dis[k]+ed[i].val)
                {
                    dis[ed[i].to]=dis[k]+ed[i].val;
                    node p;
                    p.v=ed[i].to;
                    p.u=dis[p.v];
                    q.push(p);
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&s,&t);
        for(int i=1,a,b,c;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
        dijkstra();
        printf("%d
    ",dis[t]);
        return 0;
    }
  • 相关阅读:
    [Web] 被遗忘的知识点 XHTML
    [项目实践进阶篇] Android 项目中使用Ant + Groovy能干什么?
    使用Ant,第1部分:将Ant脚本引入Java项目
    [Web] 被遗忘的知识点 JavaScript加载管理最佳实践
    [Web] 被遗忘的知识点 iFrames(HTML)过时了没有?
    Android ProGuard
    stream.js
    GUID(全球唯一标识符)
    解析算术表达式
    LCG(linear congruential generator)伪随机数生成器
  • 原文地址:https://www.cnblogs.com/charlesss/p/10742391.html
Copyright © 2011-2022 走看看