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(美国计算机协会计算机图形 ...
随机推荐
- PHP简单post验证绕过
if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("*******", "****&quo ...
- JQuery demo
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- gridControl控件动态绑定列
DataTable dt = =Query.GetCustome=(ref customColumnCount); //绑定列 gridView.Columns.Add(}); gridView.Co ...
- Lambda表达式关于like问题(未解决)
参考文章: http://stackoverflow.com/questions/3616215/like-in-lambda-expression-and-linq 1. c=>c.name. ...
- Install MySQL on Mac OS X——MAC安装MySQL
很多关于如何安装MySQL的教程已经过时了,或者比必须的步骤复杂得多.这篇教程将展示如何安装MySQL,启动MySQL,以root用户进入MySQL,以及创建删除退出数据库. Step 1: 下载My ...
- [经验分享] 最近调试FT232H遇到的坑
cnblogs.com Yeats叶子 原创,转载请注明原始地址 - http://www.cnblogs.com/xiedidan/p/ft232h-poc.html Abstract FT232H ...
- Docker / CI / CD
CI Weekly #6 | 再谈 Docker / CI / CD 实践经验 CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动 ...
- C语言 百炼成钢8
//题目22:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定 //比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x, z比,请编程序找出 //三 ...
- Microsoft Visual Studio 正忙
简介:Microsoft Visual Studio 正忙,Microsoft Visual Studio 正在等待内部操作完成.如果经常在正常使用的情况下遇到此延迟, 请向Microsoft报告此情 ...
- 如何使用Native Messaging API 打开window程序
问 如何使用Native Messaging API 打开window程序 cmd javascript terminal chrome Tychio 2013年03月26日提问 关注 1 关注 收藏 ...