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

    题目背景

    众所周知,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<=10000 pi<=100

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    
    using namespace std;
    const int N=50010;
    const int INF=9999999;
    
    int head[N],peo[N],dis[N],pre[N],print[N],js;
    int now=1,ple,n,start;
    bool vis[N];
    struct node{
        int u,v,nxt;
    }E[N*100];
    queue<int>q;
    
    inline int read()
    {
        int x=0;char c=getchar();
        while(c<'0'||c>'9')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    
    inline void add(int u,int v)
    {
        E[now].u=u;
        E[now].v=v;
        E[now].nxt=head[u];
        head[u]=now++;
    }
    
    inline void spfa(int start)
    {
        for(int i=1;i<=n;i++)
            dis[i]=INF;
        dis[start]=peo[start];
        vis[start]=1;
        q.push(start);
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            vis[top]=0;
            for(int i=head[top];~i;i=E[i].nxt)
            {
                if(dis[E[i].v]>dis[top]+peo[E[i].v])
                {
                    dis[E[i].v]=dis[top]+peo[E[i].v];
                    pre[E[i].v]=top;
                    if(!vis[E[i].v])
                        vis[E[i].v]=1,
                        q.push(E[i].v);
                }
            }
        }
    }
    
    int main()
    {
        n=read();start=read();ple=read();
        for(int i=1;i<=n;i++)
            head[i]=-1;
        for(int i=1;i<=n;i++)
        {
            peo[i]=read();
            int _peo=read();
            for(int j=1;j<=_peo;j++)
            {
                int v=read();
                add(i,v);
            }
        } 
        spfa(start);
        if(dis[1]==INF||dis[1]==peo[1])
        {
            printf("No way!");
            return 0;
        }
        int now=1;
        while(now!=start)
        {
            print[++js]=now;
            now=pre[now];
        }
        print[++js]=start;
        for(int i=js;i>=2;i--)
            printf("%d->",print[i]);
        printf("1
    ");
        printf("%d",ple-dis[1]/10);
        return 0;
    }
    
    /*
    4 3 10      
    30 0
    13 1 1
    7 2 4 2
    3 1 1
    */
    

      严重怀疑样例质量,

    if(dis[E[i].v]>dis[top]+peo[E[i].v])
    > 改成 +,竟然能过样例,呵呵呵(全WA)。
    然而,这份代码WA1。
  • 相关阅读:
    scala-for高级用法
    scala-for
    numpy每行,没列中的最小值
    NLP
    sql-server笔记-sql
    openlayers加载geoserver的WMS服务出现点标注显示不全
    oracle删除表
    idea-debug
    python-windows安装相关问题
    mybatis-oracle 新增序列
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7191366.html
Copyright © 2011-2022 走看看