第k短路———2018沈阳网络赛 D题

坑点在于:绝对大于的第k短路

板子题

代码:

#include<bits/stdc++.h>
using namespace std;
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int   M = 20005, N = 2005;
struct Item {
    int   to;
    int   val;
    int   next;
} ee[M], ee2[M];
struct Item2 {
    int   to;
    int   g,f;
    bool operator<(const Item2 &r ) const
    {
        if(r.f==f)
            return r.g<g;
        return r.f<f;
    }
};

bool  vis[N];
int   n,m, s,t ,k, cnt, cnt2, dis[N], head[N], head2[N], dis_k1;;
void init()
{
    memset(head,-1,sizeof(head));
    memset(head2,-1,sizeof(head2));
    mes(vis, false);
    cnt=cnt2=1;
}

void Add(int   from, int   to,int   val) {
    ee[cnt].to=to;
    ee[cnt].val=val;
    ee[cnt].next=head[from];
    head[from]=cnt++;
}
void Add2(int   from, int   to,int   val)
{
    ee2[cnt2].to=to;
    ee2[cnt2].val=val;
    ee2[cnt2].next=head2[from];
    head2[from]=cnt2++;
}

bool Spfa(int   s, int   n, int   head[], Item ee[], int   dist[])
{
    queue<int  >Q1;
    int   inq[1010];
    for(int   i=0;i<=n;i++)
    {
        dis[i]=INF;
        inq[i]=0;
    }
    dis[s]=0;
    Q1.push(s);
    inq[s]++;
    while(!Q1.empty())
    {
        int   q=Q1.front();
        Q1.pop();
        inq[q]--;
        if(inq[q]>n)
            return false;
        int   k=head[q];
        while(k>=0)
        {
            if(dist[ee[k].to]>dist[q]+ee[k].val)
            {
                dist[ee[k].to]=ee[k].val+dist[q];
                if(!inq[ee[k].to])
                {
                    inq[ee[k].to]++;
                    Q1.push(ee[k].to);
                }
            }
            k=ee[k].next;
        }
    }
    return true;
}

int   A_solve(int   s,int   t,int   n,int   k,int   head[],Item ee[],int   dist[])
{
    Item2 e,ne;
    int   cnt=0;
    priority_queue<Item2>Q;
    if(s==t)  k++;
    if(dis[s]==INF)  return -1;
    e.to=s;
    e.g=0;
    e.f=e.g+dis[e.to];
    Q.push(e);

    while(!Q.empty())
    {
        e=Q.top();
        Q.pop();
        if(e.to==t)
        {
            cnt++;
        }
        if(cnt == k-1) {       //绝对大  意思是第k条大于最短路的,,而不是大于等于
            dis_k1 = e.g;
        }
        if(cnt>=k && e.g>dis_k1)
        {
            return e.g;
        }
        for(int   i=head[e.to]; i!=-1; i=ee[i].next)
        {
            ne.to=ee[i].to;
            ne.g=e.g+ee[i].val;
            ne.f=ne.g+dis[ne.to];
            Q.push(ne);
        }
    }
    return -1;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        int T;  scanf("%d%d%d%d", &s, &t, &k, &T);
        for(int  i=1;i<=m;i++) {
            int  a,b,c;   scanf("%d%d%d",&a,&b,&c);
            Add(a,b,c);
            Add2(b,a,c);
        }

        Spfa(t,n,head2,ee2,dis);
        int  ans = A_solve(s,t,n,k,head,ee,dis);
        if(n == 1) {
          puts("yareyaredawa");
        }
        else if(ans==-1 || ans>T) {
            puts("Whitesnake!");
        }
        else  {
           puts("yareyaredawa");
        }
    }

    return 0;
}

 

posted @ 2018-09-11 20:30  姿态H  阅读(136)  评论(0编辑  收藏  举报