あなたにnnを与えるnポイントの加重無向接続グラフ、ノード番号は0 00からn− 1 n-1n−1、および配列エッジエッジもありますe d g e s、О中エッジ[i] = [fromi、toi、weighti]エッジ[i] = [from_i、to_i、weight_i]e d g e s [ i ]=[ f r o m私、T O私、w e i g h t私]表示在fromifrom_if r o m私和トイto_iT O私ノード間には重み付きの無向エッジがあります。最小スパニングツリー(MST)(MST)(M S T )は、特定のグラフのエッジのサブセットであり、すべてのノードを接続し、ループはありません。これらのエッジの重みの合計は最小です。
特定のグラフで、最小スパンツリーのすべてのキーエッジと疑似キーエッジを見つけてください。エッジがグラフから削除されると、最小スパンツリーの重みが増加するため、それがクリティカルエッジであると言えます。疑似クリティカルエッジは、一部の最小スパンツリーに表示される可能性があるが、すべての最小スパンツリーには表示されないエッジです。
キーエッジと疑似キーエッジの添え字は、それぞれ任意の順序で返すことができることに注意してください。
例1:
入力:n = 5, edges = [[0,1,1],[1,2,1],[2,3,2],[0,3,2],[0,4,3],[3,4,3],[1,4,6]]
出力:[[0,1],[2,3,4,5]]
説明:上の図は、指定された図を示しています。
次の図は、すべての最小スパンツリーを示しています。
0番目のエッジと1番目のエッジは、すべての最小スパンツリーに表示されるため、これらがキーエッジであることに注意してください。これらの2つの添え字を、出力の最初のリストとして使用します。
エッジ2、3、4、および5は、すべてのMSTの残りのエッジであるため、疑似クリティカルエッジです。それらを出力の2番目のリストとして使用します。
例2:
入力:n = 4, edges = [[0,1,1],[1,2,1],[2,3,1],[0,3,1]]
出力:[[],[0,1,2,3]]
説明:4つのエッジの重みが同じであり、そのうちの3つを選択してMSTを形成できます。したがって、4つのエッジはすべて疑似クリティカルエッジです。
ヒント:
2 <= n <= 100 1 <=エッジ。長さ<= min(200、n ∗(n − 1)2)エッジ[i]。長さ= = 3 0 <= fromi <toi <n 1 <= weighti <= 1000 2 <= n <= 100 \\ 1 <= Edges.length <= min(200、\ frac {n *(n-1)} {2})\\ Edges [i] .length == 3 \\ 0 <= from_i <to_i <n \\ 1 <= weight_i <= 10002<=n<=1 0 01<=E D G E S 。l e n g t h<=m i n (2 0 0 、2N * (N - 1 ))e d g e s [ i ] 。l e n g t h==30<=f r o m私<T O私<n1<=w e i g h t私<=1 0 0 0
所有(fromi、toi)(from_i、to_i)(f r o m私、T O私)番号のペアは互いに異なります。
アイデア
最初に、タイトルの説明にある「クリティカルエッジ」と「疑似クリティカルエッジ」の定義を理解する必要があります。
-
クリティカルエッジ:最小スパニングツリーからエッジが削除されると、最小スパニングツリーの重みが増加するため、それがクリティカルエッジであると言います。つまり、元の画像の最小スパンツリーの重みが値\ textit {value}に設定されている場合値、次にこのエッジを削除した後:
- グラフ全体が接続されておらず、最小スパンツリーがありません。
- グラフ全体が接続されており、対応する最小スパンツリーの重みはvvです。v、これは値\ textit {value}よりも厳密に大きい値。
-
疑似クリティカルエッジ:一部の最小スパンツリーに表示される可能性があるが、すべての最小スパンツリーには表示されないエッジ。つまり、最小スパニングツリーを計算するプロセスで最初にこのエッジを検討できます。つまり、マージクエリセットでこのエッジの2つのエンドポイントを最初にマージします。最終的な最小スパンツリーの重みをvvとします。v、v =値の場合v = \ textit {value}v=値の場合、このエッジは疑似クリティカルエッジです。
キーエッジは、疑似キーエッジの対応するプロパティも満たしていることに注意してください。したがって、最初に元の画像に対してKruskal \ texttt {Kruskal}を実行しますKruskalアルゴリズム、最小スパンツリーの重み値を取得します\ textit {value}値、次に各エッジを列挙し、最初に上記の方法に従ってクリティカルエッジであるかどうかを判断し、クリティカルエッジでない場合は、疑似クリティカルエッジであるかどうかを判断します。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int a[maxn][maxn];
int main() {
int n;
while (~scanf("%d", &n)) {
if (!n) break;
for (int i = 1; i <= n; i++) {
int x = i, y = i;
for (int j = 1; j <= n - i + 1; j++) {
a[x][y] = j;
x++;
}
x = i;
y = i;
for (int j = 1; j <= n - i + 1; j++) {
a[x][y] = j;
y++;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
printf("%d", a[i][j]);
if (j == n) puts(""); else printf(" ");
}
}
puts("");
}
return 0;
}