[USACO09OCT]热浪Heat Wave

时间:2019-04-20
本文章向大家介绍[USACO09OCT]热浪Heat Wave,主要包括[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\n",dis[t]);
    return 0;
}