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(美国计算机协会计算机图形 ...
随机推荐
- ref关键字的作用
ref关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中. 就是说,在调用方法的参数中使用ref关键字可以使得变量能够改变. ref和out都是 ...
- linux patch 格式与说明(收录)
转:http://blog.chinaunix.net/uid-26813001-id-3282954.html 首先介绍一下diff和patch.在这里不会把man在线文档上所有的选项都介绍一下,那 ...
- 数据爬取ing
ing import urllib for i in range(0,1,1): url='****/GetData?loginName=&userName=&beginDate=20 ...
- MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)
振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
- 解决jquery $符号的冲突
今天做项目的时候,写了一个ajax提交的js函数,然后在js调试的时候,提示发现 $.ajax ,前面的$ 符号不见了,通过网上搜索找到了下面的解决方法 jQuery中需要用到$符号,如果其他js库也 ...
- 使用git提交本地代码到github
1. 客户端选择 git在本地,有多种客户端可供选择,比如eclipse的插件EGit,还有git的官方客户端: Git Bash, Git CMD, Git GUI等. 推荐使用官方的Git Ba ...
- 用html5+js实现掌机游戏赛车demo
最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础. 游戏界面,没做什么美化. 游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自 ...
- opc 方面研究
http://opcuaservicesforwpf.codeplex.com/ WPF + OPC UA
- [BZOJ2753][SCOI2012]滑雪与时间胶囊(特殊的有向树形图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2753 分析: 第一问:直接BFS扩展知道无法扩展 第二问: 看似就是最小树形图啊= = ...