题目链接:https://codeforces.com/contest/22/problem/E
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
static const int MAXN=1e5+10;
int son[MAXN],d[MAXN];
int vis[MAXN];
int n;
vector<int> h,t;
int dfs(int x)
{
vis[x]=1;
if(!vis[son[x]]) return dfs(son[x]);
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&son[i]);
d[son[i]]++;
}
for(int i=1;i<=n;i++)
if(!d[i])
{
h.push_back(i);
t.push_back(dfs(i));
}
int cnt0=0;
for(int i=1;i<=n;i++)
if(!vis[i])
{
cnt0++;
h.push_back(i);
t.push_back(dfs(i));
}
int cnt=h.size();
if(cnt==1 && cnt0==1) cnt=0;
printf("%d\n",cnt);
for(int i=0;i<cnt;i++)
printf("%d %d\n",t[i],h[(i+1)%cnt]);
return 0;
}

本文提供了一道来自 CodeForces 平台编号为 22E 的算法题的解答思路及代码实现。该题通过深度优先搜索(DFS)寻找环,并记录了进入环的路径。主要涉及数据结构中的数组与向量,以及图遍历算法的应用。

1265

被折叠的 条评论
为什么被折叠?



