前言
本题解乃系洛谷 P2661 [NOIP2015 提高组] 信息传递题解详细说明
零、放在前面
本体也叫最小环
做法很多,在此讲一个较为简单的做法
一、大致思路
首先这是我们的一个图
因为每人只会把信息告诉一个人
所以出度只能是零
我们可以把入度为零的点全部删掉
就只会留下一些单环(不是一个)
这样我们就可以依次找这里面的最小环
也就是最快从其他同学口中得到自己生日的时间+
二、
1.输入
cin>>n;
_rep(u,1,n) {
LL v; cin>>v;
a[u]=v; b[v]++;
}
其中n不用讲,为同学数
a
[
u
]
=
v
a[u]=v
a[u]=v表示同学
u
u
u会告诉
v
v
v
b
[
]
b[]
b[]记录的是入度数
2.删入度为零
_rep(i,1,n) if(b[i]==0) cut(i);
c u t ( ) cut() cut()就是删边函数
void cut(LL s) {
b[a[s]]--;
if(b[a[s]]==0) cut(a[s]);
a[s]=-1;
return ;
}
3.计算
_rep(i,1,n) {
if(a[i]>0) {
LL sum_=Sum(i,i,0);
if(sum_<ans) ans=sum_;
}
}
cout<<ans;
LL Sum(LL bgn,LL idx,LL s) {
if(idx==bgn&&s!=0) return s;
LL idx_=a[idx];
a[idx]=0;
return Sum(bgn,idx_,s+1);
}
总结
以上就是今天要讲的内容,本博客介绍了一种博主认为比较简单的解法,如有不足之处烦请指点