zoukankan      html  css  js  c++  java
  • bzoj1975

    题解:

    A*求最短路

    采用bfs求k短路,一个一个见过去

    不会的还是看http://blog.csdn.net/jzq233jzq/article/details/68921665把

    毕竟我也是抄的

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=200005;
    struct heap
    {
        double v;
        int x;
    }h[N*20];
    queue<int>q;
    int cnt,hsum,n,m,s,t,num,p[N],nex[N],head[N];
    int x,y,vis[N],jzq,num2,p2[N],nex2[N],head2[N];
    double z,c[N],c2[N],dist[N],K;
    heap top(){return h[1];}
    void push(heap p)
    {
        h[++hsum]=p;
        for (int i=hsum;i>1;i/=2)
         if (h[i].v<=h[i/2].v)swap(h[i],h[i/2]);
        else return;
    }
    void pop()
    {
        h[1]=h[hsum--];
        int ne;
        for (int i=1;i<hsum&&i*2<=hsum;i=ne)
         {
            if (i*2+1<=hsum&&h[i*2].v>h[i*2+1].v)ne=i*2+1;
            else ne=i*2;
            if (h[ne].v<=h[i].v)swap(h[ne],h[i]);
            else return;
         }
    }
    void jb(int x,int y,double z)
    {
        p[++num]=y;c[num]=z;
        nex[num]=head[x];head[x]=num;
    }
    void jb2(int x,int y,double z)
    {
        p2[++num2]=y;c2[num2]=z;
        nex2[num2]=head2[x];head2[x]=num2;
    }
    void spfa(int x)
    {
        for (int i=1;i<=n;i++)dist[i]=2e9;
        memset(vis,0,sizeof vis);
        dist[x]=0;vis[x]=1;q.push(x);
        while (!q.empty())
         {
            int now=q.front();q.pop();
            for (int k=head2[now];k;k=nex2[k])
             if (dist[p2[k]]>dist[now]+c2[k])
              {
                dist[p2[k]]=dist[now]+c2[k];
                if (!vis[p2[k]])
                 {
                    q.push(p2[k]);
                    vis[p2[k]]=1;
                 }
              }
            vis[now]=0;
         }
    }
    void bfs()
    {
        heap rp;rp.v=dist[s];rp.x=s;push(rp);
        while (hsum)
         {
            rp=top();pop();
            int x=rp.x;
            for (int k=head[x];k;k=nex[k])
             {
                heap pr=rp;pr.x=p[k];
                pr.v=pr.v-dist[x]+c[k]+dist[p[k]];
                push(pr);
             }
            if (x==t)
             {
                cnt++;
                if (K<rp.v)
                 {
                    printf("%d",cnt-1);
                    jzq=0;
                    return;
                 }
                else K-=rp.v;
             }
         }
    }
    int main()
    {
        scanf("%d%d%lf",&n,&m,&K);
        while (m--)
         {
            scanf("%d%d%lf",&x,&y,&z);
            jb(x,y,z);jb2(y,x,z);
         }
        jzq=1;
        s=1;t=n;
        spfa(t);
        bfs();
        if (jzq)printf("%d",cnt);
        return 0;
    }
  • 相关阅读:
    golang 用tar打包文件或文件夹
    golang 最和谐的子序列
    golang 轮训加密算法
    golang map
    golang 队列
    golang 栈操作
    golang 多维数组
    golang 数组反转
    c# sendmessage control to scroll
    c# 启动的时候向其他程序传值
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8075041.html
Copyright © 2011-2022 走看看