POI SZP
2024-10-18 02:05:13
贪心:
初始所有点为白色,对于点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;
}
最新文章
- win10关机指示灯亮解决办法
- xpth 字符串截取
- 收缩SQL Server日志不是那么简单的(翻译)
- 回归——线性回归,Logistic回归,范数,最大似然,梯度,最小二乘……
- mootools和jquery冲突的解决
- Java Servlet Filter(转)
- Guava: 事件总线EventBus
- IP 碎片重组
- ping不通的几种可能原因
- hdu - 4709 - Herding
- if和for的几个经典题目
- json数据导出excel
- 异常-----freemarker.core.ParseException: Token manager error
- Android 指定 Theme
- vue路由的配置
- java Serializable和Externalizable序列化反序列化详解(转载)
- [Unity动画]03.动画事件
- 小程序开通微信支付 --- 微信商户平台绑定微信小程序APPID
- HLS:跑马灯实验
- js动态显示指定的时间