【洛谷P2661】資訊傳遞 (updated)
阿新 • • 發佈:2018-12-31
題目大意:給定一棵 N 個節點的內向樹森林,求該內向樹森林的最小環的大小(按邊計算)。
題解:先刪鏈,再計算環的大小,統計答案即可。
程式碼如下
#include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,ans,to[maxn],indeg[maxn]; bool vis[maxn]; void read_and_parse(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&to[i]),++indeg[to[i]]; } void del(int u){ vis[u]=1; if(!--indeg[to[u]])del(to[u]); } int cyc(int u,int dep){ vis[u]=1; if(vis[to[u]])return dep; else return cyc(to[u],dep+1); } void solve(){ ans=0x3f3f3f3f; for(int i=1;i<=n;i++)if(!indeg[i]&&!vis[i])del(i); for(int i=1;i<=n;i++)if(indeg[i]&&!vis[i])ans=min(ans,cyc(i,1)); printf("%d\n",ans); } int main(){ read_and_parse(); solve(); return 0; }