【洛谷P2921】Trick or Treat on the Farm
阿新 • • 發佈: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; }