zoukankan      html  css  js  c++  java
  • P4822 [BJWC2012]冻结

    P4822 [BJWC2012]冻结

    题目背景

    “我要成为魔法少女!”

    “那么,以灵魂为代价,你希望得到什么?”

    “我要将有关魔法和奇迹的一切,封印于卡片之中„„”

    在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷。

    现在,不需要立下契约也可以使用魔法了!你还不来试一试?

    比如,我们在魔法百科全书(Encyclopedia of Spells)里用“freeze”作为关键字来查询,会有很多有趣的结果。

    例如,我们熟知的 Cirno,她的冰冻魔法当然会有对应的 SpellCard 了。当然,更加令人惊讶的是,居然有冻结时间的魔法,Cirno 的冻青蛙比起这些来真是小巫见大巫了。

    这说明之前的世界中有很多魔法少女曾许下控制时间的愿望,比如 Akemi Homura、Sakuya Izayoi、……

    当然,在本题中我们并不是要来研究历史的,而是研究魔法的应用。

    题目描述

    我们考虑最简单的旅行问题吧: 现在这个大陆上有N 个城市,M条双向的道路。城市编号为1~N,,我们在1 号城市,需要到N号城市,怎样才能最快地到达呢?

    这不就是最短路问题吗?我们都知道可以用 Dijkstra、Bellman-Ford、Floyd-Warshall等算法来解决。

    现在,我们一共有K张可以使时间变慢 50%的 SpellCard,也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间 就可以减少到原先的一半。需要注意的是:

    1. 在一条道路上最多只能使用一张 SpellCard。
    2. 使用一张SpellCard 只在一条道路上起作用。
    3. 你不必使用完所有的 SpellCard。

    给定以上的信息,你的任务是:求出在可以使用这不超过K张时间减速的 SpellCard 之情形下,从城市1到城市N最少需要多长时间。

    输入格式

    第一行包含三个整数:N、M、K。

    接下来M行,每行包含三个整数:Ai,Bi,Timei,表示存在一条Ai与Bi之间的双向道路,在不使用 SpellCard 之前提下,通过它需要Timei的时间。

    输出格式

    输出一个整数,表示从1号城市到N号城市的最小用时。

    输入输出样例

    输入 #1

    4 4 1 
    1 2 4 
    4 2 6 
    1 3 8 
    3 4 8 

    输出 #1

    7

    说明/提示

    样例 1 解释

    在不使用 SpellCard 时,最短路为1→2→4,总时间为 10。现在我们可以使用 1 次 SpellCard,那么我们将通过2→4这条道路的时间减半,此时总时间为7。

    数据规模与约定

    对于100%的数据,保证:

    1<=K<=N<=50,M<=103.

    1<=Ai,Bi<=N,2<=Timei<=2×103.

    为保证答案为整数,保证所有的Timei均为偶数。

    所有数据中的无向图保证无自环、重边,且是连通的。

    分析

    这道题是一道裸的分层图,每一层的建图和原图一样,层与层之间的建图:

    i+1层与i层:

    u到v‘应该建一条t/2的边,在跑一边spfa就行了

    由于最终结束的N结点在哪一层,for循环跑一边min就行了

    Code

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e7;
    int n,m,k;
    int x,y,t;
    int head[N],cnt;
    int dis[N];
    bool vis[N];
    
    struct edge{
        int to;
        int ne;
        int t;
    }e[N*2];
    
    void add(int u,int v,int t){
        e[++cnt].to = v;
        e[cnt].ne = head[u];
        e[cnt].t = t;
        head[u] = cnt;
    }
    
    void spfa(){
        memset(dis,0x3f,sizeof(dis));
        queue<int>q;
        q.push(1);
        dis[1] = 0;
        vis[1] = 1;
        while(!q.empty()){
            int f = q.front();
            q.pop();
            vis[f] = 0;
            for(int i = head[f];i;i = e[i].ne){
                int v = e[i].to;
                if(dis[v] > dis[f] + e[i].t){
                    dis[v] = dis[f] + e[i].t;
                    if(!vis[v]){
                        q.push(v);
                        vis[v] = 1;
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 1;i <= m;i++){
            scanf("%d%d%d",&x,&y,&t);
            for(int j = 0;j <= k;j++){
                add(x+j*n,y+j*n,t);
                add(y+j*n,x+j*n,t);
            }
            for(int j = 0;j < k;j++){
                add(x+j*n,y+n*(j+1),t/2);
                add(y+j*n,x+n*(j+1),t/2);
            }
        }
        spfa();
        int ans = 0x3f3f3f3f;
        for(int i = 0;i <= k;i++)ans = min(ans,dis[n+n*i]);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    几个新角色:数据科学家、数据分析师、数据(算法)工程师
    人类投资经理再也无法击败电脑的时代终将到来了...
    Action Results in Web API 2
    Multiple actions were found that match the request in Web Api
    Routing in ASP.NET Web API
    how to create an asp.net web api project in visual studio 2017
    网站漏洞扫描工具
    How does asp.net web api work?
    asp.net web api history and how does it work?
    What is the difference between a web API and a web service?
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13279778.html
Copyright © 2011-2022 走看看