zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 沈阳赛区网络预赛 Made In Heaven(K短路)题解

    思路:K短路裸题

    代码:

    #include<queue>
    #include<cstring>
    #include<set>
    #include<map>
    #include<stack>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    const int maxn = 1000 + 10;
    const int maxm = 10000 + 10;
    const int seed = 131;
    const ll MOD = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    struct Edge{
        int v, w, next;
    };
    struct As{
        int f, g, pos;
        bool operator < (const As a) const{
            return a.f == f? a.g < g : a.f < f;
        }
    };
    int n, m, k, tot1, tot2, T;
    int head1[maxn], head2[maxn], dis[maxn];
    bool vis[maxn];
    Edge edge1[maxm], edge2[maxm];
    void init(){
        memset(head1, -1, sizeof(head1));
        memset(head2, -1, sizeof(head2));
        tot1 = tot2 = 0;
    }
    void addEdge(int u, int v, int w){
        edge1[tot1].v = v;
        edge1[tot1].w = w;
        edge1[tot1].next = head1[u];
        head1[u] = tot1++;
    
        edge2[tot2].v = u;
        edge2[tot2].w = w;
        edge2[tot2].next = head2[v];
        head2[v] = tot2++;
    }
    void spfa(int st){
        for(int i = 0; i <= n; i++) dis[i] = INF;
        memset(vis, false, sizeof(vis));
        vis[st] = true;
        dis[st] = 0;
        queue<int> q;
        while(!q.empty()) q.pop();
        q.push(st);
        while(!q.empty()){
            int u = q.front();
            q.pop();
            vis[u] = false;
            for(int i = head2[u]; i != -1; i = edge2[i].next){
                int v = edge2[i].v;
                int w = edge2[i].w;
                if(dis[v] > dis[u] + w){
                    dis[v] = dis[u] + w;
                    if(!vis[v]){
                        vis[v] = true;
                        q.push(v);
                    }
                }
            }
        }
    }
    int Astar(int st, int end){
       int cnt = 0;
       priority_queue<As> q;
       while(!q.empty()) q.pop();
       if(st == end) k++;
       if(dis[st] == INF) return -1;
       As a, b;
       a.pos = st, a.g = 0, a.f = a.g + dis[st];
       q.push(a);
       while(!q.empty()){
            a = q.top();
            q.pop();
            if(a.f > T) return -1;
            if(a.pos == end && a.f <= T){
                cnt++;
                if(cnt == k) return 1;
            }
            for(int i = head1[a.pos]; i != -1; i = edge1[i].next){
                b.pos = edge1[i].v;
                b.g = a.g + edge1[i].w;
                b.f = b.g + dis[b.pos];
                q.push(b);
            }
       }
       return -1;
    }
    int main(){
        int s, e;
        while(~scanf("%d%d", &n, &m)){
            init();
            scanf("%d%d%d%d", &s, &e, &k, &T);
            for(int i = 1; i <= m; i++){
                int u, v, w;
                scanf("%d%d%d", &u, &v, &w);
                addEdge(u, v, w);
            }
            spfa(e);
            int ans = Astar(s, e);
            if(ans == -1)
                printf("Whitesnake!
    ");
            else
                printf("yareyaredawa
    ");
        }
        return 0;
    }
  • 相关阅读:
    剑指offer:合并两个排序的链表
    剑指offer:调整数组顺序使奇数位于偶数前面
    剑指offer:链表中倒数第K个结点
    牛客网在线编程:末尾0的个数
    剑指offer7:数值的整数次方
    牛客网在线编程:计算糖果
    牛客网在线编程:求数列的和
    牛客网在线编程:公共字符
    剑指offer7:斐波那契数列
    Qt入门之常用qt控件认知之Button系列
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9631767.html
Copyright © 2011-2022 走看看