題解 P2661 【信息傳遞】

這題 因爲每一個人只能告訴一我的,因此每一個點的出度爲1。找最小環。數組

坑點:

圖不必定是連通圖spa

故不能只用一遍bfs/dfs。code

下面講個人思路

三個數組\(next,vis,dep\);
\(next_i\)記錄第i位同窗傳遞的人
\(vis_i\)記錄當前點是否訪問和是哪一次訪問
\(dep_i\)記錄第i個點在它的訪問裏的深度
\(dfs\)時出現點已被訪問,判斷io

  • 是當前\(dfs\)訪問過的點\(then\)更新答案
  • 不然不考慮
#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

相關文章
相關標籤/搜索