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

洛谷——U10223 Cx大帝遠征埃及

單向 想要 else blank spfa can star 是個 code

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("\n%d",sum); 74 } 75 return 0; 76 }

洛谷——U10223 Cx大帝遠征埃及