zoukankan      html  css  js  c++  java
  • bzoj2662 冻结

    和上一题差不多 不过需要考虑用越多次不一定越好

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<queue>
     8 #define rep(i,l,r) for(int i=l;i<r;i++)
     9 #define clr(a,x) memset(a,x,sizeof(a))
    10 using namespace std;
    11 int read()
    12 {
    13     char c=getchar();
    14     while(!isdigit(c)) c=getchar();
    15     int ans=0;
    16     while(isdigit(c)){
    17         ans=ans*10+c-'0';
    18         c=getchar();
    19     }
    20     return ans;
    21 }
    22 struct edge{
    23     int to,v;
    24 };
    25 struct node{
    26     int num,d,f;
    27     bool operator <(const node&q)const{
    28         return d>q.d;
    29     }
    30 };
    31 const int maxn=55,maxm=1005,maxk=55;
    32 int n,m,k,s,t,d[maxn][maxk];
    33 bool p[maxn][maxk];
    34 priority_queue<node>q;
    35 vector<edge>e[maxn];
    36 int main()
    37 {    
    38     clr(p,0);
    39     node start;
    40     start.d=0;
    41     start.f=0;
    42     start.num=1;
    43     n=read();m=read();k=read();
    44     rep(i,1,n+1)
    45         rep(j,0,k+1)
    46             d[i][j]=10000000;
    47      d[1][0]=0;
    48     while(m--){
    49         edge ed;
    50         int from=read();
    51         ed.to=read();ed.v=read();
    52         e[from].push_back(ed);
    53         swap(from,ed.to);
    54         e[from].push_back(ed);
    55     }
    56     q.push(start);
    57     while(!q.empty()){
    58         node now=q.top(); 
    59         q.pop();
    60         if(p[now.num][now.f]) continue;
    61         p[now.num][now.f]=1;
    62         rep(i,0,e[now.num].size()){
    63             if(now.d+e[now.num][i].v<d[e[now.num][i].to][now.f]){
    64                 d[e[now.num][i].to][now.f]=now.d+e[now.num][i].v;
    65                 node next;
    66                 next.f=now.f;
    67                 next.d=d[e[now.num][i].to][now.f];
    68                 next.num=e[now.num][i].to;
    69                 q.push(next);
    70             }
    71             if(now.d+e[now.num][i].v/2<d[e[now.num][i].to][now.f+1]){
    72                 d[e[now.num][i].to][now.f+1]=now.d+e[now.num][i].v/2;
    73                 node next;
    74                 next.f=now.f+1;
    75                 next.d=d[e[now.num][i].to][now.f+1];
    76                 next.num=e[now.num][i].to;
    77                 q.push(next);;
    78             }
    79         }
    80     }
    81     int mn=10000000;
    82     rep(i,0,k+1) mn=min(mn,d[n][i]);
    83     printf("%d",mn);
    84     return 0;
    85 }
    View Code

    2662: [BeiJing wc2012]冻结

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 484  Solved: 268
    [Submit][Status][Discuss]

    Description

      “我要成为魔法少女!”   
      “那么,以灵魂为代价,你希望得到什么?” 
    “我要将有关魔法和奇迹的一切,封印于卡片之中„„”   
       
      在这个愿望被实现以后的世界里,人们享受着魔法卡片(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最少需要多长时间。

    Input


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

    Output

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

    Sample Input

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

    Sample Output

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

    HINT

    对于100%的数据:1  ≤  K  ≤  N ≤  50,M  ≤  1000。 

      1≤  Ai,Bi ≤  N,2 ≤  Timei  ≤  2000。 

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

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

     

    Source

     
    [Submit][Status][Discuss]
  • 相关阅读:
    Linux下使用wireshark权限问题
    Ubuntu关机出错卡死 PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00e5(Receiver ID)
    东南大学《操作系统》课程作业 第二章
    东南大学《操作系统》课程作业 第一章
    东南大学《操作系统》课程作业 第三章
    回溯算法
    拓扑排序之课程表问题
    C++虚函数多态
    JMETER安装及基本使用
    JMETER正则表达式提取器使用
  • 原文地址:https://www.cnblogs.com/chensiang/p/4625196.html
Copyright © 2011-2022 走看看