bzoj3037 创世纪
两种解法:
一、树状DP
/*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int INF=;
const int mxn=;
int hd[mxn],to[mxn],next[mxn];
int f[mxn],g[mxn],c[mxn];
int vis[mxn];
int cnt=;
int n,p,eg;
void add_edge(int u,int v){
to[++cnt]=v;next[cnt]=hd[u];hd[u]=cnt;
return;
}
void dfs(int now){
vis[now]=;
if(vis[c[now]])
p=now;
else dfs(c[now]);
return;
}
void solve(int now,int fa){
f[now]=;g[now]=INF;vis[now]=;
if(now==eg){
g[now]=;
}
int u=hd[now];
while(u!=){
if(to[u]!=fa && to[u]!=p)
{
// printf("test msg4: now (%d) to (%d) \n",now,to[u]);
solve(to[u],now);
g[now]+=min(f[to[u]],g[to[u]]);
g[now]=min(g[now],f[now]+f[to[u]]-);
f[now]+=min(f[to[u]],g[to[u]]);
// printf("test msg5: f[now]: %d g[now]: %d \n",f[now],g[now]);
}
u=next[u];
}
}
int main(){
scanf("%d",&n);
int i,j;
for(i=;i<=n;i++){
scanf("%d",&c[i]);
add_edge(c[i],i);//反向存边
}
int ans=;
for(i=;i<=n;i++){
if(!vis[i]){
// printf("test msg1: dfs(%d)\n",i);
dfs(i);
// printf("test msg2: p(%d)\n",p);
eg=c[p];
solve(p,);
int tmp=f[p];
// printf("test msg3: tmp(%d)\n",tmp);
eg=;
solve(p,);
ans+=min(tmp,g[p]);
}
}
printf("%d\n",n-ans);
}
二、强行拓扑贪心
AC
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int INF=;
const int mxn=;
int in[mxn];
int ctl[mxn];
bool flag[mxn];
int n,cnt=;
int ans=;
int main(){
scanf("%d",&n);
int i,j;
for(i=;i<=n;i++){
scanf("%d",&ctl[i]);
in[ctl[i]]++;//统计入度
}
queue<int>q;
for(i=;i<=n;i++){
if(!in[i]) q.push(i);
}
int tmp;
while(!q.empty()){
tmp=q.front();
q.pop();
if(!flag[tmp] && !flag[ctl[tmp]]){
ans++;
flag[ctl[tmp]]=;
in[ctl[ctl[tmp]]]--;
if(!in[ctl[ctl[tmp]]]){//减后入度为0
q.push(ctl[ctl[tmp]]);
} }
flag[tmp]=;
}
for(i=;i<=n;i++){
if(!flag[i]){
cnt=;j=i;
flag[i]=;
while(ctl[j]!=i){
flag[ctl[j]]=;//处理环
cnt++;
j=ctl[j];
}
ans+=cnt/;//环上一半的点可以投放
}
}
printf("%d\n",ans);
return ;
}
bzoj3037 创世纪的更多相关文章
- BZOJ3037 创世纪[基环树DP]
实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...
- BZOJ3037 创世纪(基环树DP)
基环树DP,攻的当受的儿子,f表选,g表不选.并查集维护攻受关系.若有环则记录,DP受的后把它当祖宗,再DP攻的. #include <cstdio> #include <iostr ...
- 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP
[BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...
- [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树
创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
- Poetize4 创世纪
3037: 创世纪 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 123 Solved: 66[Submit][Status] Description ...
- 为创世纪图书馆(Library Genesis)作镜像
简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...
- 编程哲学之C#篇:01——创世纪
我们能否像神一样地创建一个世界? 对于创建世界而言,程序员的创作能力最接近于神--相对于导演,作家,漫画家而言,他们创建的世界(作品)一旦完成,就再也不会变化,创建的角色再也不会成长.而程序员创建的世 ...
- CH6401 创世纪
6401 创世纪 0x60「图论」例题 描述 上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i].现在,上帝要把它们中的 ...
- 图形学创世纪——写在SIGGRAPH 40年的边上
40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...
随机推荐
- iOS开发如何提高(from 唐巧的博客)
http://blog.devtang.com/blog/2014/07/27/ios-levelup-tips/
- isScroll代码
html: <div class="wrap"> <div class="content"> //内容-必须为第一个子元素 </d ...
- 在文本中匹配链接并添加A标签
(?<!href="|">)(https?:\/\/[\w\-\.!~?&=+\*\'(),\/]+)((?!\<\/\a\>).)* 这个正则可以 ...
- The Skyline Problem
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- C语言 百炼成钢16
//题目46:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只 //猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 //一个,它同样把 ...
- [PY]进制转换
ord('j') 将字符转换为10进制 int(ord(‘j’),16) 把10进制转化为16进制 http://www.108kb.com/python/item/43662.htm http:// ...
- 【译】Design For Maturing Android-为日渐成熟的Android做设计
为日渐成熟的Android做设计 [声明] 本篇博文英文版原文来自Smashing Magazine,本人经Smashing Magazine邮件授权后翻译,转载请注明出处.谢谢!原文地址. 我将不定 ...
- [git]图解git常用命令
本文图解git中最常用的命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提 ...
- 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤
编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...
- Activiti系列: 如何在web中使用activiti和sql server
最近要开始使用activiti结合原有的系统来开发一个专业领域内的业务管理软件,以下记录了第一次搭建该开发平台过程中所遇到的各种问题,备忘. 一.按照如下方式新建一个web工程 之所以要用 ...