首页 技术 正文
技术 2022年11月12日
0 收藏 562 点赞 4,872 浏览 1878 个字

爱心蜗牛

猫猫把嘴伸进池子里,正准备“吸”鱼吃,却听到门铃响了。猫猫擦了擦脸上的
水,打开门一看,那人正是她的好朋友——川川。
川川手里拿着一辆玩具汽车,对猫猫说:“这是我的新汽车!”接着,伴随一阵塑料
叩击声,玩具汽车的车门竟开了,一只蜗牛慢慢吞吞爬了出来。 
“哇!这么大的蜗牛……”猫猫惊讶道。 
“这是我的宠物蜗牛,他叫点点。”川川介绍道。
“把他送给我好吗?”猫猫央求道。
“可以让他陪你几天,但是不能送给你……”
点点沿着川川的身体,爬到了地上,又移到了猫猫的池子旁边,只听见猫猫向川川
介绍她的“创意吃鱼法 ”,心里不禁起了一丝凉意:“这个女生太毒了……吃鱼前还要玩
鱼……”转眼一看,池中的鱼依旧畅快地游来游去。
“或许这些鱼听不懂猫语吧……好在我会一点儿猫语,也会一点鱼语……阿弥陀
佛,善哉善哉。我还是救救这些鱼吧……”点点自言自语,一边费力地移动着身躯。他
认识到——单凭自己的力量,把猫猫的阴谋告诉每一条鱼,似乎不太可能——自己底盘
太低,走不快,看来只得想其他办法来传达信息。一翻认真思考之后,点点想到,如果
把猫猫的计划告诉其中一条鱼,再让鱼们互相传达消息,那么在相对较短的时间内,每
条鱼都会得知猫猫的计划。
鱼们的社会等级森严,除了国王菜鱼之外,每条鱼均有且只有一个直接上级,菜鱼则没
有上级。如果A 是B的上级,B 是的C上级,那么 A 就是的C上级。
绝对不会出现这样两条鱼A、B :A是的上级,B 也是的上级。
最开始的时刻是0,点点要做的,就只是用1 单位的时间把猫猫的阴谋告诉某一条
“信息源鱼”,让鱼们自行散布消息。在任意一个时间单位中,任何一条已经接到通知
的鱼,都可以把消息告诉他的一个直接上级或者直接下属。
现在,点点想知道:
1.到底需要多长时间,消息才能传遍池子里的鱼? 
2.使消息传递过程消耗的时间最短,可供选择的“信息源鱼”有那些?

输入格式:

有多组输入数据,每组数据:
第一行有一个数N(N ≤1000 ),表示池中的鱼数,池鱼按照1到n编上了号码、国
王菜鱼的标号是1。 
第2 行到第N 行(共N-1 行),每一行一个数,第I 行的数表示鱼I的直接上级的标号。

输出格式:

对于每组输入数据:
第一行有一个数,表示最后一条鱼接到通知的最早时间。
第二行有若干个数,表示可供选择的“信息源鱼”的标号,按照标号从小到大的顺序输出,中间用空格分开。

样例输入:

81134443

样例输出:

53 4 5 6 7

数据范围:

N ≤1000

时间限制:

1000

 貌似网上没有题解,我来写一个。树形动规,其实此题下属、上级没有任何区别,只不过是一棵树,没有环罢了。对于每一个节点以它为根节点动规,将所有子树的f值从大到小排序,s1,s2…sn(s1<s2<…<sn)则该节点f[x]=max{si+i}注意排序时如果用stl就要把数组开在void里面。

 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; ; ],des[N*],size=,ans[N],f[N]; bool vis[N]; inline void combine(int x,int y) {     size++;     des[size]=y;     next[size]=first[x];     first[x]=size;     return; } inline bool cmp(int x,int y) {     return x>y; } inline void dfs(int x) {     ];     vis[x]=;     ;     for(int i=first[x];i;i=next[i]) if(!vis[des[i]])     {         dfs(des[i]);         rec[++sir]=f[des[i]];     }     ) f[x]=;     sort(rec+,rec+sir+,cmp);     ;i<=sir;i++) f[x]=max(f[x],rec[i]+i);     return; } int main() {     int x,n;     scanf("%d",&n);     ;i<=n;i++)     {         scanf("%d",&x);         combine(x,i);         combine(i,x);     }     ,mi=,tmp;     ;i<=n;i++)     {         memset(vis,,sizeof(vis));         memset(f,,sizeof(f));         dfs(i);         tmp=f[i];         if(tmp<mi)         {             mi=tmp;             s=;             ans[]=i;         }         else if(tmp==mi) ans[++s]=i;     }     printf("%d\n",mi);     ;i<=s;i++) printf("%d ",ans[i]);     printf("\n");     ; }

 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,000
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,512
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,358
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,141
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,771
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,849