第K短路【枚举】(无环情况下)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<sstream>
#include<vector>
#include<string>
#include<set>

using namespace std;

#define IOS ios::sync_with_stdio(false); cin.tie(0);
#define REP(i,n) for(int i=0;i<n;++i)

int read(){

    int r=0,f=1;char p=getchar();
    while(p>'9'||p<'0'){if(p=='-')f=-1;p=getchar();}
    while(p>='0'&&p<='9'){r=r*10+p-48;p=getchar();}return r*f;
}

typedef long long ll;
typedef unsigned long long ull;
const int Maxn = 1005;
const long long LINF = 1e18;
const int INF = 0x3f3f3f3f;
const int Mod = 1e6+7;
const double PI = acos(-1.0);

struct Edge {
    int u,v,w;
} edges[10005];

struct Node {
    int d,u;
    Node (int dis,int from): d(dis),u(from) {}
    bool operator < (const Node &a1) const {
        return d < a1.d;
    }
};

int dis1[Maxn],dis2[Maxn],N,M,S,E,K,T;
bool used[Maxn];
vector <int> G[Maxn];
vector <int> a;

void spfa (int s,int *dis) {
    priority_queue<Node> qu;
    for (int i = 1; i <= N; ++i) {
        used[i] = false;
        dis[i] = INF;
    }
    qu.push(Node (0,s));
    dis[s] = 0;
    while (!qu.empty()) {
        Node tmp = qu.top(); qu.pop();
        int x = tmp.u;
        if(used[x]) continue;
        used[x] = true;
        for (int i = 0; i < G[x].size(); ++i) {
            Edge &e = edges[G[x][i]];
            if(dis[e.v] > dis[e.u]+e.w) {
                dis[e.v] = dis[e.u]+e.w;
                qu.push(Node(dis[e.v],e.v));
            }
        }
    }
}

int main (void)
{
    while (scanf("%d%d",&N,&M) != EOF) {
        scanf("%d%d%d%d",&S,&E,&K,&T);
        for (int i = 0; i <= N; ++i) G[i].clear();
        int u,v;
        for (int i = 1; i <= M; ++i) {
            scanf("%d%d",&u,&v,&edges[i].w);
            edges[i].u = u; edges[i].v = v;
            G[u].push_back(i);
        }
        spfa(S,dis1); spfa(E,dis2); // dis1为起点到其他点的最短距离,dis2为终点到其他的最短距离
        a.clear();
        for (int i = 1; i <= N; ++i) {
            if(dis1[i] == 0 || dis1[i] == INF) continue;
            int m = G[i].size(); Edge e;
            for (int j = 0; j < m; ++j) {
                e = edges[G[i][j]];
                a.push_back(dis1[i]+dis2[e.v]+e.w); // dis1的点与dis2的点连接,就是一条通路
            }
        }
        sort(a.begin(),a.end());
        if(a.size() >= K && a[K-1] <= T) printf("yareyaredawa\n");
        else printf("Whitesnake!\n");
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值