您的位置:首页 > 其它

【图论】【RQNOJ】心许的回忆[Special Judge]

2010-07-13 17:33 232 查看

题目描述

题目背景
话说仙剑奇侠传四故事发生之时,勇气亲眼目睹琼华陨落,又见天河射下琼华,化去天火。着实为之感动。他自叹不如,因而决定归隐园田。

不过他在人间人生地不熟,为了找到一个落脚之地,他找到了同为仙兽的王蓬絮和花楹,两位MM在仔细的讨论商议之后决定——带勇气去蜀山!

经过一番周折,勇气终于在蜀山安家落户,住在原先独孤宇云的房间里(他已经当掌门去了),每天同其他弟子一同修道。

大约 10 年过后,仙盟开始举办一年一度的仙迷聚会,当然要邀请一些仙剑中的著名人物登场,这次就邀请了这三位仙兽。但不想,麻烦就因此开始……

题目叙述
仙盟的邀请函上的地址只写到北京某某某地,蓬絮和花楹哪里知道是什么地方?她们找来了勇气,勇气发觉他三百年之前去过那里,但是因为过了太久,已经记不清楚了。但是两位MM仙兽当然不肯放过这一展露头角的机会,在她们的死磨烂缠之后,勇气终于决定要想办法记起之前这一段回忆。

他把思绪整理了一下,发现过去那一段回忆是有很多情节交织在一起。他把所有的记忆划分成 n 个片断,他把去北京的记忆编号为 1,其他按照 2-n 的顺序依次编号。他发现,很多记忆的回忆之间是存在一先后关系的,比如说,你在回忆使用法术之前必须先回忆清楚什么东西叫法术。当然,同一样片断只需要回忆一次就可以了,比如看书和写字都要求识字,但想要看书和写字只需要回忆一次识字的知识就行了。

于是他把所有的这些关系写成了一张表,现在,他需要找出一种合适的方案来回忆起去北京的过去。你可以帮帮他吗?

数据范围
对于全部的数据,n <= 10。

输入格式

第一行一个数 n,表示有 n 个记忆片断,其中第一段为去北京的记忆。
第二行至第 n + 1 行,表示这 n 个片断的先后次序的表。第 i + 1 行的第一个数字为 c[i],表示在片断 i 被回忆之前必须要回忆过 c[i] 个片断,后面依次列出这 c[i] 个片断的编号,每两个数字间由一个空格隔开。
文件中出现的数字均为正整数,且没有多余的空行和空格。

输出格式

一行,依次输出回忆的顺序,两个数之间由一个空格隔开。行首和行尾不要有多余的空格。如果有多种可能的方案,任意输出一种即可。
如果不存在任何方案,输出“What a poor boy!”。

样例输入

#include<stdio.h>
bool v[20][20];
int pre_num[20],nex_num[20],ans[100];
int n,remain,len;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
int t;
scanf("%d",&t);
int tt;
for (int j=1;j<=t;++j)
{
scanf("%d",&tt);
++pre_num[i];
++nex_num[tt];
v[i][tt]=true;
}
}
remain=n;
while (1)
{
if (remain==1&&pre_num[1]==0) break;
int k=0;
for (int i=2;i<=n;++i)
if (pre_num[i]==0)
{
k=i;
break;
}
if (k==0) break;
pre_num[k]=-1;
for (int i=1;i<=n;++i)
if (v[i][k])
{
--pre_num[i];
v[i][k]=0;
}
ans[++len]=k;
--remain;
}
for (int i=1;i<=len;++i) printf("%d ",ans[i]);
printf("1/n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: