zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)

    求第k短路模板

    先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥。。。

    #include<iostream>
    #include<cstdio> 
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<string.h>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<fstream>
    #include<cstdlib>
    #include<ctime>
    #include<list>
    #include<climits>
    #include<bitset>
    #include<random>
    #include <ctime>
    #include <cassert>
    #include <complex>
    #include <cstring>
    #include <chrono>
    using namespace std;
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define fopen freopen("input.in", "r", stdin);freopen("output.in", "w", stdout);
    #define left asfdasdasdfasdfsdfasfsdfasfdas1
    #define tan asfdasdasdfasdfasfdfasfsdfasfdas
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    typedef long long ll;
    typedef unsigned int un;
    const int desll[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    const int mod=1e9+7;
    const int maxn=1e3+7;
    const int maxm=1e5+7;
    const double eps=1e-8;
    int n,k,m;
    int ar[maxn];
    int head[maxn],sz,rehead[maxn];
    bool vis[maxn];
    int dis[maxn];
    struct node
    {
        int b,nex,c;
    }no[maxn*10],reno[maxn*10];
    void add(int a,int b,int c)
    {
        no[sz].b=b;
        no[sz].c=c;
        no[sz].nex=head[a];
        head[a]=sz;
        reno[sz].b=a;
        reno[sz].c=c;
        reno[sz].nex=rehead[b];
        rehead[b]=sz++;
    }
    struct state{
        int all,pre,v;
        state(int a,int b,int c){
            all=a;pre=b;v=c;
        }
        state(){
            
        }
        bool operator<(const state& s)const{
            return all>s.all;
        }
    };
    priority_queue<state> qu;
    void init(int s,int e)
    {
        memset(vis,0,sizeof(vis));
        memset(dis,-1,sizeof(dis));
        queue<int> qu;
        qu.push(e);vis[e]=1;
        dis[e]=0;
        while(qu.size()){
            int x=qu.front();
            qu.pop();
            vis[x]=0;
            for(int i=rehead[x];i!=-1;i=reno[i].nex){
                int v=reno[i].b;
                if(dis[v]==-1 || dis[v]>dis[x]+reno[i].c){
                    dis[v]=dis[x]+reno[i].c;
                    if(vis[v]==0){
                        vis[v]=1;
                        qu.push(v);
                    }
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF){
            int s,e,k,t;
            scanf("%d%d%d%d",&s,&e,&k,&t);
            memset(head,-1,sizeof(head));
            memset(rehead,-1,sizeof(rehead));sz=0;
            for(int i=0;i<m;i++){
                int a,b,c;scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
            }
            int ans=0;
            init(s,e);
            //for(int i=1;i<=n;i++)cout<<dis[i]<<" ";cout<<endl;
            if(dis[s]==-1)ans=-1;
            else{
                while(qu.size())qu.pop();
                qu.push(state(dis[s],0,s));
                state mid;
                int ins=0;
                while(qu.size()){
                    mid = qu.top();
                    qu.pop();
                    if(mid.v==e){
                        ins++;
                        if(ins==k){
                            ans=mid.all;
                            break;
                        }
                    }
                    for(int i=head[mid.v];i!=-1;i=no[i].nex){
                        int v=no[i].b;
                        qu.push(state(mid.pre+no[i].c+dis[v],mid.pre+no[i].c,v));
                    }
                }
            }
            if(ans!=-1 && ans<=t)printf("yareyaredawa
    ");
            else printf("Whitesnake!
    ");
        }
        return 0;
    }
  • 相关阅读:
    C语言中 单引号与双引号的区别
    Linux主分区,扩展分区,逻辑分区的联系和区别
    fdisk
    df du 的区别
    filesystem
    git clone
    curl
    HDR 高动态范围图像
    source ~/.bashrc 什么意思
    linux 挂载
  • 原文地址:https://www.cnblogs.com/wa007/p/9622899.html
Copyright © 2011-2022 走看看