COGS 2105. [NOIP2015] 資訊傳遞 解法二 解題報告
阿新 • • 發佈:2019-02-10
2105. [NOIP2015] 資訊傳遞
稍有常識的人就可以看出,這題是求有向圖的最小環,dfs即可解決。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn = 200000 + 10; int to[maxn],vis[maxn],num[maxn];//num[i]記錄經過節點i的“時間”--dfs序 int n,ans=1<<30,tot;//tot是當前“時間” void dfs(int v){ if(num[v]){ if(vis[v])ans = min(ans, tot-num[v]+1);//更新最小環的長度 return; } num[v] = ++tot; vis[v] = 1; dfs(to[v]);//搜尋下一個節點 vis[v] = 0; } int main() { #ifndef DEBUG string FileName="2015message"; freopen((FileName+".in").c_str(),"r",stdin); freopen((FileName+".out").c_str(),"w",stdout); #endif scanf("%d",&n); for(int i = 1; i <= n; i++)scanf("%d",&to[i]); for(int i = 1; i <= n; i++)if(!vis[i]) dfs(i); printf("%d",ans); }