zoukankan      html  css  js  c++  java
  • tyvj1326:剑人合一

    描述

    他们飘呀飘,飘呀飘,飘呀飘,飘呀飘~~~
    经过七七八十一天的漂泊,残雪、夏夜和水手2011,终于到达了无尽的深渊--lcyz岛,正当他们准备从后门登陆时,突然半路杀出了一个程咬金--一个身高十二尺,腰围380的怪物。这正是传说中lcyz岛上的上古怪物,通道守护者,但是我们都叫他门卫。根据上古传说,只有拿到岛上的上古兵器毛剑,才可打败门卫。有了毛剑,神马都是浮云、、、
    毛剑被珍藏在一个灰常隐秘的地下室里,残雪经过重重险阻,终于进入了剑冢,此时毛剑静静地插在一块由纯金打造的纯金上。残雪看见此景,不由感叹一声,好剑啊。又大喊一声:看我剑人合一。说罢,便伸手欲抽剑,但是,一个迷宫瞬间弹了出来(别问我怎么弹出来的-。-),这个迷宫情况如下:
    迷宫中有n块区域,其中m条道路,如果从a区域到b区域存在一条道路的话,残雪要想通过这条道路,需要耗费一定的体力值,但是,某些道路上摆放着食物,残雪经过这些道路,可以补充一定的体力值,可以理解为权值为负的道路,现在残雪还要留着体力去打败门岗,需要用最小的体力值拿到毛剑,现在就请你帮助他们取出毛剑。残雪所处的位置在1区域,毛剑所处的位置在n区域。

    输入格式

    第一行:一个n,表示区域数目。
    第二行:m,表示存在m条道路。
    以下m行:
    每行三个数:x、y、z
    区域x、y的标号和他们之间耗费的体力值z

    输出格式

    从残雪到毛剑所耗费的最小体力(结果为负则为补充体力)。

    测试样例1

    输入



    1 2 5 
    2 3 10 
    1 3 20 

    输出

    15

    备注

    对于30%的数据,有n<=1000,m<=2000
    对于50%的数据,有n<=5000,m<=10000;
    对于100%的数据,有n<=10000,m<=50000;
    保证此题所涉及的所有数据都是整数。
    题解
    裸spfa就能过,单向边数据无负环,如果是双向边要怎么做??请教神犇们
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<queue>
     5 #define maxn 10005
     6 #define maxm 50005
     7 #define inf 1<<29
     8 using namespace std;
     9 queue<int> q;
    10 int ecnt,n,m,dis[maxn],vis[maxn],head[maxn];
    11 struct edge{
    12     int u,v,w,next,f;
    13 }E[maxm*2];
    14 void addedge(int u,int v,int w)
    15 {
    16     E[++ecnt].u=u;
    17     E[ecnt].v=v;
    18     E[ecnt].w=w;
    19     E[ecnt].next=head[u];
    20     head[u]=ecnt;
    21 }
    22 void spfa()
    23 {
    24     for(int i=1 ; i<=n ; ++i )
    25         dis[i]=inf;
    26     dis[1]=0;
    27     vis[1]=1;
    28     q.push(1);
    29     while(!q.empty())
    30     {
    31         int d=q.front();q.pop();
    32         vis[d]=0;
    33         for(int i=head[d] ; i ; i=E[i].next )
    34         {
    35             int v=E[i].v;
    36             int w=E[i].w;
    37             if(dis[v]>dis[d]+w)
    38             {
    39                 dis[v]=dis[d]+w;
    40                 if(!vis[v])
    41                 {
    42                     vis[v]=1;
    43                     q.push(v);
    44                 }
    45             }
    46         }
    47     }
    48 }
    49 int main()
    50 {
    51     int u,v,w;
    52     scanf("%d%d",&n,&m);
    53     for(int i=1 ; i<=m ; ++i)
    54     {
    55         scanf("%d%d%d",&u,&v,&w);
    56         addedge(u,v,w);
    57     }
    58     spfa();
    59     printf("%d",dis[n]);
    60     return 0;
    61 }
  • 相关阅读:
    良心之作送你几个Xsheel使用小技巧
    面试问Redis集群,被虐的不行了......
    一文搞定Redis五大数据类型及应用场景
    写给大忙人的Redis主从复制,花费五分钟让你面试不尴尬
    Redis删除策略和逐出策略
    一文带你了解Redis持久化完整版本
    MySQL--创建计算字段
    MySQL语句与正则表达式
    SQLZOO练习二--SELECT from Nobel Tutorial
    SQLZOO练习(一)SELECT BASICS,SELECT form world
  • 原文地址:https://www.cnblogs.com/fujudge/p/7500897.html
Copyright © 2011-2022 走看看