1. 程式人生 > >U10223 Cx大帝遠征埃及

U10223 Cx大帝遠征埃及

城市編號 首都 () ron getchar ont 詳細 tchar mat

題目背景

眾所周知,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\n");
    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。

U10223 Cx大帝遠征埃及