当前位置: 代码迷 >> 综合 >> 【NOIP】【提高组】【p2661】【信息传递】
  详细解决方案

【NOIP】【提高组】【p2661】【信息传递】

热度:94   发布时间:2024-01-19 22:23:11.0

题目

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,ch,yh,mina=0x7f7f7f7;
int d[200010];
int c[200010];
void dfs(int s,int ans)
{if(c[s]==k){yh=s;ch=ans;return;}if(c[s]!=k&&c[s]) return;c[s]=k;dfs(d[s],ans+1);if(s==yh) mina=min(mina,ch-ans);
}
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>d[i];for(int i=1;i<=n;i++)if(!c[i]){k++;dfs(i,0);yh=0;ch=0;}printf("%d",mina);return 0;
}

求图中最小的环。

如果一个人的入度为0,把这个人和他连出的边删去(即标记这个人并将他下一个人的入度减 1)
如果下一个人的入度为0则将他也删去……
最后把所有入度为0的人都删去了,剩下的都是环。