【yxtギャングから転載:%%% ]
それは互いに素セットすることができ
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200010;
int n, fa[N], ans = 0x3f3f3f3f;
int get (int x, int &cnt) { //cnt记录环的长度
cnt ++;
if (fa[x] == x) return x;
else return get(fa[x], cnt);
}
int main () {
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
fa[i] = i;
for (int i = 1; i <= n; i ++) {
int cnt = 0, f;
scanf("%d", &f);
if (get(f, cnt) == i) {
ans = min(ans, cnt); //维护最小的环
}else
fa[i] = f;
}
printf("%d", ans);
return 0;
}
シーケンス・トポロジーを使用することも可能
康板子总结那里
これは、DFS + BFSも使用することができます
void dfs(int u,int k){
dfsn[u]=k;
vis[u]=1;
q.push(u);
int x=a[u];
if(vis1[x]) return ;
else if(vis[x]) ans=min(ans,dfsn[u]-dfsn[x]+1);
else dfs(x,k+1);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
if(!vis1[i]){
dfs(i,1);
while(!q.empty()) {
int x = q.front();
q.pop();
vis1[x] = 1;
}
}
printf("%d\n", ans);
return 0;
}
また、無向グラフリングの需要:
-
N接合点を分析する無向グラフG環が存在する場合
仮定:ノードの数がM、Eは再びいくつかの部分に分割されている図形を決定するために横断されるエッジの数にのみ非環式場合、各連結成分について(Pの一部であると仮定、すなわち、P図成分接続あり)ツリー、すなわち:ノード数=長く追加される連結成分のループがある満たす数-1縁>接合点-1不等式Pピクチャがある限りエッジの数は、それが得られた:ノード接続されたすべてのコンポーネントのすべてのエッジの数> +数その番号:E + P> MがそのようのみE + Pと判定され> Mは、シクロアルキル、または非環式で画像を表します。
-
各連結成分のために、環Gは、図の環の合計数の合計に対する各成分の全く通信しないリングの数、別個の計算。
提供:で表さPによって接続コンポーネントのペア、およびその隣接行列表記
- 幅優先スパニングツリーアルゴリズムP(すなわちスパニング)を用いて測定、によって表さ-1支持ツリーを見つける手順は、ツリーの支持体側に添加されます。(図で示されるべき権利ない1)。
- より-1隣接行列中の量側を探している(もちろん、それは図題されていない場合、1はエッジの値を取得する必要があり、0ではない)、端部に接続されたノードiとjと仮定する。-1側面の重量。
- 深さ優先トラバーサルアルゴリズムは、例えば-1,0,1ないトラバース表す。頂点jの間のすべての単純なパス(各頂点に割り当てられた異なる重みを注意することは、I頂点に由来するが、隣接ノードがトラバースされていますトラバースされていない、と隣接ノードは、これを行うトラバーストラバースされました)訪問されたノードへのバックを防ぐためです;
- スパニングツリーの定義によれば、それぞれさらに1側のスパニングツリーは、ループが存在するであろう。スパニングツリーのパスiとjを探しています。エッジ(i、j)を有する単純なパスは、接続リングを得ることができます。環の出力。
- 重みは、2つの頂点が縁部及びV Wで接続されていると仮定すると、隣接していないエッジを探すため-1マトリックスを続けます。-1側面の重量。
- Jから頂点に頂点Iとの間のすべての単純なパスを決定します。
- 単純なパスは、リングの出力をループを与えるためにそれぞれのエッジ(i、j)とに接続された決定しました。
- 辺の重みは-1であるまでは隣接行列がなくなるまで繰り返し4-7ステップ。