一.2661信息传递(P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
这个题相信大家并不陌生。
我思考的方法就是处理每一个点,如果入度为0,那么就删除这个点和所连的边,然后继续访问与它相连的节点。最后仍未删除地节点一定在环内。
然后再跑dfs找最小环。
二.2921(P2921 [USACO08DEC]Trick or Treat on the Farm G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
就记忆化搜索就完事了,一些处理细节看代码:
#include<iostream> using namespace std; const int maxn=100010; int n,d[maxn],s[maxn],h[maxn],flag; bool vis[maxn]; int dfs(int now,int nowc) { if(h[now]!=0) return nowc-1+h[now]; if(vis[now]==true) { h[now]=nowc-s[now];flag=now; return nowc-1; } vis[now]=1; s[now]=nowc; int ans=dfs(d[now],nowc+1); if(flag!=0) { if(now==flag) flag=0; else h[now]=h[flag]; } else h[now]=h[d[now]]+1; vis[now]=0; return ans; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>d[i]; for(int i=1;i<=n;i++) cout<<dfs(i,1)<<endl; return 0; }