zoukankan      html  css  js  c++  java
  • 洛谷——U10223 Cx大帝远征埃及

    https://www.luogu.org/problem/show?pid=U10223#sub

    题目背景

    众所周知,Cx是一个宇宙大犇。Cx能文善武,一直在为大一统的实现而努力奋斗着。Cx将调用他的精锐军队,一个精锐士兵最多可以战胜十个埃及士兵。同时Cx是个爱才的人,他想要制定一份能使在占领埃及的前提下,使自己的军队损失最小的作战方案。Cx可做好了充分的准备,他收集到了很多情报,经过了长期的准备,在今天这个伟大的日子,他终于作下了远征埃及的决定!

    题目描述

    Cx将会把他收集到的所有情报都汇总给你(当然不能有什么遗漏的),情报的内容包括了埃及的所有城市所驻扎的军队人数,和与其单向连通的城市(路程什么的对千里马来说不算什么)。编号1的城市即为首都,占领首都即战争胜利!他将会告诉你他调度的军队人数。

    输入输出格式

    输入格式:

    第一行三个整数n和m,sum。n表示埃及的所有城市个数,m表示Cx大帝开始出征的城市标号,sum表示精锐军队的人数。

    以下的n行,第i+1行即为关于埃及编号为i的城市的情报,第一个整数ai表示在此驻扎的军队人数,第二个整数pi表示与此城市连通的城市数目,接下来pi个整数为与其连通的城市编号。

    输出格式:

    第一行输出Cx大帝要想完成占领埃及的目标的最优攻占城市顺序方案。第二行输出精锐军队剩余的人数,详细格式见输出样例。如军队的人数过少无法使Cx大帝占领埃及,则输出"No way!”

    输入输出样例

    输入样例#1:
    4 3 10
    30 0
    13 1 1
    7 2 4 2
    3 1 1
    输出样例#1:
    3->4->1
    6

    说明

    样例说明:最少需要对付的埃及士兵为40个,而精锐士兵以一敌十,所以最后还有6个存活。 数据保证p1=0。

    士兵杀8个死不了,下一次再解决两个就GG了。

    对于100%的数据: 2<=n<=50000 pi<=100

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 const int M(100+15);
     8 const int N(50000+5);
     9 const int INF(9999999);
    10 int n,s,sum,v,nn,w[N];
    11 
    12 int head[N],sumedge;
    13 struct Edge
    14 {
    15     int v,next;
    16     Edge(int v=0,int next=0):
    17         v(v),next(next){}
    18 }edge[M*N];
    19 void ins(int u,int v)
    20 {
    21     edge[++sumedge]=Edge(v,head[u]);
    22     head[u]=sumedge;
    23 }
    24 
    25 queue<int>que;
    26 int inq[N],dis[N],pre[N];
    27 void SPFA(int s)
    28 {
    29     for(int i=1;i<=n;i++) dis[i]=INF;
    30      dis[s]=w[s];
    31     inq[s]=1;
    32     que.push(s);
    33     for(;!que.empty();)
    34     {
    35         int fro=que.front(); que.pop(); inq[fro]=0;
    36         for(int i=head[fro];i;i=edge[i].next)
    37         {
    38             v=edge[i].v;
    39             if(dis[v]>dis[fro]+w[v])
    40             {
    41                 dis[v]=dis[fro]+w[v];
    42                 pre[v]=fro;
    43                 if(!inq[v])
    44                 {
    45                     inq[v]=1;
    46                     que.push(v);
    47                 }
    48             }
    49         }
    50     }
    51 }
    52 
    53 int main()
    54 {
    55     scanf("%d%d%d",&n,&s,&sum);
    56     for(int i=1;i<=n;i++)
    57     {
    58         scanf("%d%d",&w[i],&nn);
    59         for(int j=1;j<=nn;j++)
    60             scanf("%d",&v),ins(i,v);
    61     }
    62     int k[N],pos=0;
    63     SPFA(s);
    64     sum=sum-dis[1]/10;
    65     if(sum<0) printf("No way!");
    66     else
    67     {
    68         int start=1,end=s;
    69         for(;start!=end;start=pre[start])
    70             k[++pos]=start;
    71         printf("%d",s);
    72         for(int i=pos;i>=1;i--) printf("->%d",k[i]);
    73         printf("
    %d",sum);
    74     }
    75     return 0;
    76 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    灵活读取Configuration文件
    Web页面访问权限
    母版页(MasterPage),你真得了解了吗?
    基于对象和面向对象
    [翻译]Silverlight 3中的tooltip
    2009年自我总结
    W3C CSS Validator 更喜欢CSS文件以一个class开头而不是注释?
    【翻译】读取文本文件(txt、csv、log、tab、fixed length)(上)
    1z0062 题库解析2
    1z0062 题库解析3
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7191669.html
Copyright © 2011-2022 走看看