K短路

最近在学A*,又因为某位大佬讲了一下k短路算法

所以就拿来练练。然而以我的能力,在考试中并不会考到。

题目是[SDOI2010]魔法猪学院。

然而luogu数据有加强。没有左偏堆过不了233

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
struct node
{
    int point;
    double value;
    bool operator < (const node& a)const
    {
        return value>a.value;
    }
    node (int pint,double dus)
    {
        point=pint;
        value=dus;
    }
};
vector<node>tor[6010];
vector<node>bac[6010];
int n,m,a,b;
double e,distanc;
double dis[6010];
bool inque[6010];
void SPFA(int begin,int end)
{
    for(int i=1;i<=n;i++)
        dis[i]=0x7ffffff;
    dis[begin]=0;
    inque[begin]=true;
    queue<int>q;
    q.push(begin);
    while(!q.empty())
    {
        int pas=q.front();
        q.pop();
        inque[pas]=false;
        for(int i=0;i<bac[pas].size();i++)
        {
            int nxt_1=bac[pas][i].point;
            double nxt_2=bac[pas][i].value;
            if(dis[nxt_1]>dis[pas]+nxt_2)
            {
                dis[nxt_1]=dis[pas]+nxt_2;
                if(!inque[nxt_1])
                {
                    inque[nxt_1]=true;
                    q.push(nxt_1);
                }
            }
        }
    }
}
long long A_star(int begin,int end)
{
    priority_queue<node>q;
    q.push(node(begin,dis[begin]));
    long long ans=0;
    while(!q.empty())
    {
        node pas=q.top();
        q.pop();
        int pas_1=pas.point;
        double pas_2=pas.value;
        if(pas_2>e)
            return ans;
        if(pas_1==n)
        {
            e-=pas_2;
            ans+=1;
        }
        for(int i=0;i<tor[pas_1].size();i++)
            q.push(node(tor[pas_1][i].point,pas_2-dis[pas_1]+tor[pas_1][i].value+dis[tor[pas_1][i].point]));
    }
    return ans;
}
int main()
{
    scanf("%d%d%lf",&n,&m,&e);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%lf",&a,&b,&distanc);
        tor[a].push_back(node(b,distanc));
        bac[b].push_back(node(a,distanc));
    }
    SPFA(n,1);
    printf("%lld",A_star(1,n));
}
/*
4 6 15
1 2 1.5
2 1 1.5
1 3 3
2 3 1.5
3 4 1.5
1 4 1.5
*/

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/9004938.html