2017.07.10【NOIP提高组】模拟赛B组 创世纪 题解

原题:

http://172.16.0.132/senior/#contest/show/2045/2

题目描述:

上帝手中有着n种被称作“世界元素”的东西,现在他要把它们中的一部分投放到一个新的空间中去以建造世界。每种世界元素都可以限制另外一种世界元素,所以说上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素能够限制它,这样上帝就可以保持对世界的控制。
由于那个著名的有关于上帝能不能制造一块连自己都不能举起的大石头的二律背反命题,我们知道上帝不是万能的,而且不但不是万能的,他甚至有事情需要找你帮忙——上帝希望知道他最多可以投放多少种世界元素,但是他只会O(2^n)级别的算法。虽然上帝拥有无限多的时间,但是他也是个急性子。你需要帮助上帝解决这个问题。

输入:

第一行一个正整数n,表示世界元素的数目。
第二行n个正整数a_1, a_2, ..., a_n。a_i表示第i个世界元素能够限制的世界元素的编号。

输出:

最多可以投放的世界元素的数目。

样例输入:

6
2 3 1 3 6 5

样例输出:

3

样例说明:

选择2、3、5 三个世界元素即可,分别有1、4、6来限制它们。

数据范围限制:

30%的数据,n<=10。
60%的数据,n<=10^5。
100%的数据,a_i<=n<=10^6。

分析:

贪心。
找出所有没有入度的点,那么这些点必定不能选入集合中,我们沿着这些点上溯,将可以选进集合的点都选进集合。
这里“可以选进”的定义为存在一个没有被选进集合的前驱。
于是环上就会有若干个由树上决定它要选进集合的点。
我们将环按照已选入集合的点来分裂成若干段,每一段按照原来的贪心方法来贪心即可。

贪心正确性的证明:

我们将一个点从“选”的状态变成不选,显然不会改变其前驱的状态(前驱并不依赖于这个点),那么我们考虑一下后继的情况。
如果这个点x的唯一的后继y并没有被选入,那么说明它原来所有的前驱都被选入了。我们可以将它选入点集中。但是这样子可能导致y的唯一后继z无法被选入了(这种情况就是z被选入点集时依赖于y),从下图可以更直观地看出这种关系。


图片1.png

那么这时候我们就可以有两种选择,直接舍弃绿叉边,又或者将它继续往下“推”,那么递归地来看这和我们做的第一步是相同的,显然这么做并不能使得被选入边集的边数增多。
如果这个点x的唯一的后继y被选入了,那么情况是类似的,不难证明不会使得边数增多。
综上所述,通过上面所述的贪心策略能选出最大的点集。

实现:

#include<cstdio>

const int maxn=1000010;  
int a[maxn],team[maxn],head,tail,n;  
int rd[maxn];  
int ans;  
bool bz[maxn];  
  
int main()  
{  
    scanf("%d",&n);  
    for(int i=1;i<=n;i++)  
        scanf("%d",&a[i]),rd[a[i]]++;  
    for(int i=1;i<=n;i++)  
        if(!rd[i])  
            team[++tail]=i;  
    while(head<tail)  
    {  
        int t=team[++head];  
        if(!bz[t]&&!bz[a[t]])  
        {  
            bz[a[t]]=1;  
            ans++;  
            if(!--rd[a[a[t]]])  
            {  
                team[++tail]=a[a[t]];  
            }  
        }  
        bz[t]=1;  
    }  
    for(int i=1;i<=n;i++)  
    {  
        if(!bz[i])  
        {  
            int t=1;  
            bz[i]=1;  
            int c=i;  
            while(a[c]!=i)  
            {  
                c=a[c];  
                bz[c]=1;  
                t++;  
            }  
            ans+=t>>1;  
        }  
    }  
    printf("%d",ans);
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容