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\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。