C++のネットワークにおける重要な接続
n台のサーバーがあるとします。そして、これらは0からn-1まで番号が付けられ、無向のサーバー間接続によって接続され、ネットワークを形成します。ここで、connections [i] =[a、b]はサーバーaとbの間の接続を表します。すべてのサーバーは、直接または他のサーバーを介して接続されています。ここで、重要な接続とは、それが削除されると、一部のサーバーが他のサーバーに到達できなくなる接続です。重要な接続をすべて見つける必要があります。
したがって、入力がn =4で、接続=[[0,1]、[1,2]、[2,0]、[1,3]]、
のような場合
その場合、出力は[[1,3]]
になりますこれを解決するには、次の手順に従います-
-
1つのセットを定義する
-
アレイディスクを定義する
-
配列を低く定義する
-
1つの2D配列retを定義する
-
関数dfs()を定義します。これにより、ノード、パー、1つの2D配列グラフが取得されます。
-
ノードが訪問済みの場合、-
-
戻る
-
-
訪問先にノードを挿入
-
disc [node]:=time
-
low [ノード]:=時間
-
(時間を1つ増やします)
-
グラフ[ノード]
のすべての要素xについて-
xがparと同じ場合、-
-
次の部分を無視し、次の反復にスキップします
-
-
xが訪問されていない場合、-
-
dfs(x、node、graph)
-
low [node]:=low[node]とlow[x]
の最小値 -
disc [node]
-
retの最後に{node、x}を挿入します
-
-
-
それ以外の場合
-
low [node]:=low[node]とdisc[x]
の最小値
-
-
-
メインの方法から、次のようにします-
-
ディスクのサイズをn+1に設定
-
サイズをn+1に設定
-
時間:=0
-
サイズグラフn+1
のリストの配列を定義します -
初期化i:=0の場合、i
-
u:=v [i、0]
-
w:=v [i、1]
-
グラフの最後にwを挿入します[u]
-
グラフの最後にuを挿入します[w]
-
-
dfs(0、-1、グラフ)
-
retを返す
-
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << "[";
for(int j = 0; j <v[i].size(); j++){
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]"<<endl;
}
class Solution {
public:
set<int> visited;
vector<int> disc;
vector<int> low;
int time;
vector<vector<int> > ret;
void dfs(int node, int par, vector<int> graph[]) {
if (visited.count(node))
return;
visited.insert(node);
disc[node] = low[node] = time;
time++;
for (int x : graph[node]) {
if (x == par)
continue;
if (!visited.count(x)) {
dfs(x, node, graph);
low[node] = min(low[node], low[x]);
if (disc[node] < low[x]) {
ret.push_back({ node, x });
}
} else{
low[node] = min(low[node], disc[x]);
}
}
}
vector<vector<int> > criticalConnections(int n, vector<vector<int> >& v) {
disc.resize(n + 1);
low.resize(n + 1);
time = 0;
vector<int> graph[n + 1];
for (int i = 0; i < v.size(); i++) {
int u = v[i][0];
int w = v[i][1];
graph[u].push_back(w);
graph[w].push_back(u);
}
dfs(0, -1, graph);
return ret;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{0,1},{1,2},{2,0},{1,3}};
print_vector(ob.criticalConnections(4,v));
} 入力
4, {{0,1},{1,2},{2,0},{1,3}} 出力
[[1, 3, ],]
-
C++でのリスのシミュレーション
木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で
-
C++のフローネットワークで最小のs-tカットを見つける
次のフローネットワークがあるとします。ご存知のように、s-tカットは、ソースsノードとシンクtノードが異なるサブセットにある必要があるカットであり、ソースセットからシンク側に向かうエッジが含まれます。ここで、s-tカットの容量は、カットセット内の各エッジ容量の合計で表されます。ここでは、特定のネットワークの最小容量s-tカットを見つける必要があります。ここで期待される出力は、最小カットのすべてのエッジです。 したがって、入力が次のような場合 その場合、出力は[(1,3)、(4,3)、(4,5)]になります。 これを解決するには、次の手順に従います- ノード=6 関数bf