這題 因爲每一個人只能告訴一我的,因此每一個點的出度爲1。找最小環。數組
圖不必定是連通圖spa
故不能只用一遍bfs/dfs。code
三個數組\(next,vis,dep\);
\(next_i\)記錄第i位同窗傳遞的人
\(vis_i\)記錄當前點是否訪問和是哪一次訪問
\(dep_i\)記錄第i個點在它的訪問裏的深度
當\(dfs\)時出現點已被訪問,判斷io
#include <cstdio> using namespace std; int n,ans; int vis[200005],dep[200005],next[200005]; int main(){ ans=1<<17; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&next[i]); for(int i=1;i<=n;i++) if(vis[i]==0){ int dfs=0,j; for(j=i;vis[j]==0;j=next[j])vis[j]=i,dep[j]=++dfs; if(vis[j]==i && dfs-dep[j]<ans)ans=dfs-dep[j]; } printf("%d\n",ans+1); return 0; }
點個贊吧class