【ACM-ICPC 2018 沈阳赛区网络预赛 D】Made In Heaven(第k短路 模板题)

题目链接: https://nanti.jisuanke.com/t/31445
求第K短路,判断是否小于等于T

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int M=10000+100;
const int N=1010;
int n,m;
int s,ex,k,t;
int u,v,w;
int ans;
int cnt,cnt2;
struct edge
{
    int v;
    int w;
    int next;
}e[M],e2[M];
int dis[N],vis[N],head[N],head2[N];
struct node
{
    int pos;
    int cost;
    node(){}
    node(int pos,int cost):pos(pos),cost(cost){}
    friend bool operator<(node a,node b)
    {
        return a.cost>b.cost;
    }
};
struct node2
{
    int v;
    int g,f;
    node2(){}
    node2(int v,int g,int f):v(v),g(g),f(f){}
    friend bool operator<(node2 a,node2 b)
    {
        if(a.f==b.f)
            return a.g>b.g;
        return a.f>b.f;
    }
};
void init()
{
    cnt=0;
    cnt2=0;
    fill(dis,dis+N,inf);
    memset(head,-1,sizeof(head));
    memset(head2,-1,sizeof(head2));
    memset(vis,0,sizeof(vis));
}
void add(int u,int v,int w)
{
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
void add2(int u,int v,int w)
{
    e2[cnt2].v=v;
    e2[cnt2].w=w;
    e2[cnt2].next=head2[u];
    head2[u]=cnt2++;
}
void Dijkstra(int* head,edge* e)
{
    priority_queue<node> q;
    node now;
    dis[ex]=0;
    q.push(node(ex,0));
    while(!q.empty())
    {
        now=q.top();
        q.pop();
        if(vis[now.pos])
            continue;
        vis[now.pos]=1;
        for(int i=head[now.pos];i!=-1;i=e[i].next)
        {
            if(dis[e[i].v]>dis[now.pos]+e[i].w)
            {
                dis[e[i].v]=dis[now.pos]+e[i].w;
                q.push(node(e[i].v,dis[e[i].v]));
            }
        }
    }
}
int Astar()
{
    priority_queue<node2> q;
    node2 now;
    int num=0;
    if(s==ex)//感觉可以去掉
        k++;//
    if(dis[s]==inf)
        return inf;
    q.push(node2(s,0,0+dis[s]));
    while(!q.empty())
    {
        now=q.top();
        q.pop();
        if(now.v==ex)
            num++;
        if(num>=k)
            return now.g;
        for(int i=head[now.v];i!=-1;i=e[i].next)
            q.push(node2(e[i].v,now.g+e[i].w,now.g+e[i].w+dis[e[i].v]));
    }
    return inf;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        scanf("%d%d%d%d",&s,&ex,&k,&t);
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add2(v,u,w);
        }
        Dijkstra(head2,e2);
        ans=Astar();
        if(ans<=t)
            printf("yareyaredawa\n");
        else
            printf("Whitesnake!\n");

    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值