研华acdp手机版_generation z

研华acdp手机版_generation z上帝手中有 N 种世界元素,每种元素可以限制另外 1 种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。现在,上帝要把它们中的一部分投放到一个新的空间中去建造世界。为了世界的和平与安宁,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。上帝希望知道,在此前提下,他最多可以投放多少种世界元素?输入格式第一行是一个整数 N,表示世界元素的数目。第二行有 N 个整数 A[1],A[2],…,A[N]。A[i] 表示第 i 个世界元素能够限制的世界元素的编号。输出格式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

上帝手中有 N 种世界元素,每种元素可以限制另外 1 种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。

现在,上帝要把它们中的一部分投放到一个新的空间中去建造世界。

为了世界的和平与安宁,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。

上帝希望知道,在此前提下,他最多可以投放多少种世界元素?

输入格式
第一行是一个整数 N,表示世界元素的数目。

第二行有 N 个整数 A[1],A[2],…,A[N]。A[i] 表示第 i 个世界元素能够限制的世界元素的编号。

输出格式
一个整数,表示最多可以投放的世界元素的数目。

数据范围
N≤106,1≤A[i]≤N
输入样例:
6
2 3 1 3 6 5
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
const int M = 2 * N;
const int INF = 0x0f3f3f3f;
struct Edge{ 

int v,next;
}edge[M];
int head[N],cnt;
void add(int u,int v){ 

edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
int ins[N],st[N],cir[N],pox,pre[N],pree[N];
int f[N][2];
bool rm[M],mark[N];
int ans;
void dfs_c(int u){ 

st[u] = ins[u] = true;
for(int i = head[u];~i;i = edge[i].next){ 

if((i & 1) == 1)continue;
int v = edge[i].v;
pre[v] = u;
pree[v] = i;
if(!st[v])dfs_c(v);
else if(ins[v]){ 

for(int k = u;k != v;k = pre[k]){ 

cir[pox ++] = k;
}
cir[pox ++] = v;
}
}
ins[u] = false;
}
void dfs(int u){ 

f[u][0] = 0,f[u][1] = -INF;
int m = -INF;
for(int i = head[u];~i;i = edge[i].next){ 

int v = edge[i].v;
if((i & 1) == 0 || rm[i])continue;
dfs(v);
f[u][0] += max(f[v][1],f[v][0]);
m = max(m,-max(f[v][1],f[v][0]) + f[v][0]);
}
if(mark[u])f[u][1] = max(f[u][0] + m,max(f[u][0] + 1,1));
else f[u][1] = f[u][0] + m + 1;
}
int main(){ 

int n;
memset(head,-1,sizeof head);
scanf("%d",&n);
int x;
for(int i = 1;i <= n;i ++){ 

scanf("%d",&x);
add(i,x),add(x,i);
}
int ans = 0;
for(int i = 1;i <= n;i ++){ 

int res = 0;
if(!st[i]){ 

pox = 0;
dfs_c(i);
if(pox >= 1){ 

int u = cir[0];
int p = pre[u];
rm[pree[u] ^ 1] = true;
mark[u] = true;
memset(f,0,sizeof f);
dfs(p);
res = max(res,f[p][0]);
mark[u] = false;
memset(f,0,sizeof f);
dfs(p);
res = max(res,f[p][1]);
rm[pree[u] ^ 1] = false;
}
}
ans += res;
}
cout<<ans<<endl;
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169058.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python for循环多个参数处理_python for循环嵌套

    python for循环多个参数处理_python for循环嵌套实际上,“使用for循环遍历数组的最简单方法”(Python类型被命名为“list”BTW)是第二种方法,即foriteminsomelist:do_something_with(item)哪个FWIW适用于所有iterable(列表、元组、集合、dict、迭代器、生成器等)。基于范围的C风格版本被认为是非常不通俗的,并且只适用于列表或类似列表的iterable。WhatIwouldl…

  • Vagrant入门

    Vagrant入门

  • revit二次开发教程_BIM二次开发

    revit二次开发教程_BIM二次开发1、利用revit2012和vs2010实现二次开发。1)第一步,利用vs2010建立c#Windows服务类型的项目。2)给新生成的项目添加引用,(放在工程上右键),添加revit相关,把

  • C#常用 API函数大全[通俗易懂]

    C#常用 API函数大全[通俗易懂]常用WindowsAPI1.API之网络函数WNetAddConnection创建同一个网络资源的永久性连接WNetAddConnection2创建同一个网络资源的连接WNetAddConnection3创建同一个网络资源的连接WNetCancelConnection结束一个网络连接WNetCancelConnection2结束一个网络连接WNetCloseEn

    2022年10月30日
  • 深度相机 结构光_结构光三维成像原理

    深度相机 结构光_结构光三维成像原理版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究。 https://blog.csdn.net/electech6/article/details/78707839 &lt;/div&gt; &lt;linkrel="styles…

    2022年10月26日
  • ASP.NET的DropDownList触发SelectedIndexChanged事件「建议收藏」

    ASP.NET的DropDownList触发SelectedIndexChanged事件「建议收藏」前言: DropDownList就是一个下拉列表,当初在单独使用的时候不怎么需要写程序,所以没有发现一点问题。 但当我需要将两个DropDownList关联使用的时候,发现没有触发里面的事件。需要一个按钮来触发事件里面的程序。 在早些时候,我就知道在程序窗体的加载事件里面需要加!IsPostBack{},但这次好像有点不一样。DropDownList触发方法1、首先我们还是在页面的窗体加载事件中,用if(!IsPostBack){代码段}2、我们在引用DropDownList的时候,为它加一个

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号