一.2661信息传递P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这个题相信大家并不陌生。

我思考的方法就是处理每一个点,如果入度为0,那么就删除这个点和所连的边,然后继续访问与它相连的节点。最后仍未删除地节点一定在环内。

然后再跑dfs找最小环。

二.2921P2921 [USACO08DEC]Trick or Treat on the Farm G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

图论--图的存储和遍历_ios

 

 就记忆化搜索就完事了,一些处理细节看代码:

#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;
}