贪心:

初始所有点为白色,对于点i,若a[i]为白色则将其染成与i不同的颜色。

证明:若点i确定为白色,a[i]染白色也只能提供一个黑点,故a[i]染黑色不会差;若所有指向i的点均为黑色,则i只能是白色。

使用拓扑排序实现,一开始将无入度的点入队,最后剩下的环从任意处切开即可。

环上的情况可以分环为奇数,偶数通过讨论得到个数是对的。

SAC大佬%%%orz,提供链接:http://www.cnblogs.com/NaVi-Awson/

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int>Q;
int n,m;
int dist[],a[],ans=;
bool vis[],c[];
int in[];
int main()
{int i,j;
//freopen("szp.in","r",stdin);
//freopen("szp.out","w",stdout);
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
in[a[i]]++;
}
for (i=;i<=n;i++)
if (!in[i]) Q.push(i);
while (!Q.empty())
{
int u=Q.front();
Q.pop();
vis[u]=;
if (c[u])
{
in[a[u]]--;
if (!c[a[u]]) Q.push(a[u]);
}
else
{
if (!c[a[u]]) ans++,c[a[u]]=,Q.push(a[u]);
}
}
for (i=;i<=n;i++)
if (!vis[i])
{
vis[i]=;
j=i;
while (!vis[a[j]])
{
if (!c[a[j]]&&!c[j]) ans++,c[a[j]]=;
j=a[j];vis[j]=;
}
}
cout<<ans;
}

最新文章

  1. win10关机指示灯亮解决办法
  2. xpth 字符串截取
  3. 收缩SQL Server日志不是那么简单的(翻译)
  4. 回归——线性回归,Logistic回归,范数,最大似然,梯度,最小二乘……
  5. mootools和jquery冲突的解决
  6. Java Servlet Filter(转)
  7. Guava: 事件总线EventBus
  8. IP 碎片重组
  9. ping不通的几种可能原因
  10. hdu - 4709 - Herding
  11. if和for的几个经典题目
  12. json数据导出excel
  13. 异常-----freemarker.core.ParseException: Token manager error
  14. Android 指定 Theme
  15. vue路由的配置
  16. java Serializable和Externalizable序列化反序列化详解(转载)
  17. [Unity动画]03.动画事件
  18. 小程序开通微信支付 --- 微信商户平台绑定微信小程序APPID
  19. HLS:跑马灯实验
  20. js动态显示指定的时间

热门文章

  1. 201621123062《java程序设计》第八周作业总结
  2. 项目Alpha冲刺Day2
  3. djangoueditor 集成xadmin
  4. django 连接mysql
  5. jav音频格式转换 ffmpeg 微信录音amr转mp3
  6. Linq 巧用 Max,Sum
  7. Swagger: 一个restful接口文档在线生成+功能测试软件
  8. 解决编写的 html 乱码问题
  9. linux下的Shell编程(5)循环
  10. SQL Server数据库优化的10多种方法