洛谷——U10223 Cx大帝远征埃及
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——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!”
输入输出样例
4 3 10 30 0 13 1 1 7 2 4 2 3 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大帝远征埃及的主要内容,如果未能解决你的问题,请参考以下文章