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