zoukankan      html  css  js  c++  java
  • cogs 826. [Tyvj Feb11] GF打dota

    826. [Tyvj Feb11] GF打dota

    ★★☆   输入文件:dota.in   输出文件:dota.out   简单对比
    时间限制:1 s   内存限制:128 MB

    众所周知,GF同学喜欢打dota,而且打得非常好。今天GF和Spartan同学进行了一场大战。

    现在GF拿到一张地图,地图上一共有n个地点,GF的英雄处于1号点,Spartan的基地位于n号点,

    GF要尽快地选择较短的路线让他的英雄去虐掉Spartan的基地。但是Spartan早就料到了这一点,

    他有可能会开挂(BS~)使用一种特别的魔法,一旦GF所走的路线的总长度等于最短路的总长度时,

    GF的英雄就要和这种魔法纠缠不休。这时GF就不得不选择非最短的路线。现在请你替GF进行规划。

     

    对于描述的解释与提醒:

     

    1.无向路径,花费时间当然为非负值。

     

    2.对于本题中非最短路线的定义:不管采取任何迂回、改道方式,

    只要GF所走的路线总长度不等于1到n最短路的总长度时,就算做一条非最短的路线。

    3.保证1~n有路可走。

     

    输入:

    第一行为n,m(表示一共有m条路径)
    接下来m行,每行3个整数a,b,c,表示编号为a,b的点之间连着一条花费时间为c的无向路径。
    接下来一行有一个整数p,p=0表示Spartan没有开挂使用这种魔法,p=1则表示使用了。

     

    输出:

    所花费的最短时间t,数据保证一定可以到达n。

     

    样例输入1:
    5 5
    1 2 1
    1 3 2
    3 5 2
    2 4 3
    4 5 1
    0

    样例输入2:
    5 5
    1 2 1
    1 3 2
    3 5 2
    2 4 3
    4 5 1
    1

     

    样例输出1:
    4
    样例输出2:
    5

    对于50%的数据,1<=n,m<=5000
    对于70%的数据,1<=n<=10000, 1<=m<=50000,p=0,
    对于100%的数据,1<=n<=10000, 1<=m<=50000,p=1
    无向图,花费时间c>=0

    各个测试点1s

    来源:lydliyudong    Tyvj February二月月赛第二场  第2场

    错因:没有注意题目是无向图。

    思路:次短路板子题

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    #define MAXN 400000
    using namespace std;
    struct nond{
        int g,f,to;
        bool operator<(const nond &r) const {
            if(r.f==f)    return r.g<g;
            else return r.f<f;
        }
    }tmp,opt;
    int n,m,p,s,t,cnt,tot,tot1,tot2;
    int dis[MAXN],vis[MAXN],dis2[MAXN],vis2[MAXN];
    int to[MAXN],net[MAXN],cap[MAXN],head[MAXN];
    int to1[MAXN],net1[MAXN],cap1[MAXN],head1[MAXN];
    void add(int u,int v,int w){
        to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
        to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot;
        to1[++tot1]=v;net1[tot1]=head1[u];cap1[tot1]=w;head1[u]=tot1;
        to1[++tot1]=u;net1[tot1]=head1[v];cap1[tot1]=w;head1[v]=tot1;
    }
    void spfa(int s){
        queue<int>que1;
        for(int i=0;i<=n;i++)    dis[i]=INF;
        que1.push(s);
        vis[s]=1;dis[s]=0;
        while(!que1.empty()){
            int now=que1.front();
            que1.pop();
            vis[now]=0;
            for(int i=head1[now];i;i=net1[i])
                if(dis[to1[i]]>dis[now]+cap1[i]){
                    dis[to1[i]]=dis[now]+cap1[i];
                    if(!vis[to1[i]]){
                        vis[to1[i]]=1;
                        que1.push(to1[i]);
                    }
                }
        }
    }
    int Astar(int kk){
        priority_queue<nond>que;
        if(s==t)    kk++;
        if(dis[s]==INF)    return -1;
        tmp.g=0;
        tmp.to=s;
        tmp.f=dis[s];
        que.push(tmp);
        while(!que.empty()){
            tmp=que.top();
            que.pop();
            if(tmp.to==t)    cnt++;
            if(cnt==kk)    return tmp.g;
            for(int i=head[tmp.to];i;i=net[i]){
                opt.to=to[i];
                opt.g=tmp.g+cap[i];
                opt.f=opt.g+dis[to[i]];
                que.push(opt);
            }
        }
        return -1;
    }
    int main(){
        freopen("dota.in","r",stdin);
        freopen("dota.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
        scanf("%d",&p);
        s=1;t=n;
        spfa(t);
        if(p==0){
            printf("%d",dis[s]);
            return 0;
        }
        else
            for(int i=1;i<=n;i++){
                cnt=0;
                int ans=Astar(i);
                if(ans!=dis[s]){
                    printf("%d",ans);
                    return 0;
                }
            }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    漫谈 C++ 的 内存堆 实现原理
    我发起了一个 .Net 开源 数据库 项目 SqlNet
    谈谈 数据库原理
    论 数据库 B Tree 索引 在 固态硬盘 上 的 离散存储
    论 东坡肉 和 红烧肉 的 区别
    浅谈 操作系统原理
    引子 初识
    P2P Downloader
    利用 MessageRPC 和 ShareMemory 来实现 分布式并行计算
    MessageRPC
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7410375.html
Copyright © 2011-2022 走看看