有N種顏色的珠子。你有第ith顏色的雙珠。你想通過連接所有的珠子來製作裝飾品。您可以使用以下算法創建裝飾:從dif構建ornamet的方法彩珠(圖論算法)
步驟#1以任意順序排列所有珠子,使相同顏色的珠子放在一起。
步驟#2飾品最初只包含排列中的第一個珠子。
步驟#3對於每個後續的珠子順序,將其加入裝飾中相同顏色的珠子。如果沒有相同顏色的珠子,它可以連接到裝飾中的任何珠子上。
所有的珠子都是不同的,即使它們具有相同的顏色。遵循上述算法可以形成多少種不同的裝飾物?如果兩個珠子在一個配置中由一個線連接,而另一個配置中沒有連接,則認爲兩個飾物是不同的。
澄清
把珠子形成想象成一棵樹,而不是一條直線。任何數量的珠子都可以連接到珠子上。
這個問題讓我瘋狂!我被告知你必須使用Cayleys算法來獲取所有的方法來爲每個顏色ci的珠子構建一棵樹,然後你必須將樹結合在一起。假設有一個將組件加入樹中的公式(s1s2。。sk)×nk - 2,但我不確定我是否擁有公式,也不相信。是否有人熟悉這個公式,或者可以幫助我解決這個問題。多謝你們。哦,順便說一句,這是我迄今爲止的算法。它正在處理一些測試案例,但也失敗了。
公共類BeadOrnament {
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int T, N;
T = stdin.nextInt();
while (T-- > 0) {
N = stdin.nextInt();
double[] colors = new double[N];
double[] trees = new double[N];
long ornaments = 0;
for (int i = 0; i < N; i++) {
colors[i] = stdin.nextInt();
}
long t = 1;
for (int i = 0; i < N; i++) {
trees[i] = Math.max(Math.pow(colors[i], colors[i] - 2), 1);
t *= trees[i];
}
long s = 1;
if (N > 1) {
for (int i = 0; i < N; i++) {
s *= colors[i];
}
s *= Math.max(Math.pow(N, colors.length - 2), 1);
}
ornaments = s * t;
System.out.println(ornaments);
}
}
}
如果任何人對於將元件連接到樹中的方式熟悉該公式,那麼它是(s1s2 ... sk)* NK -2或(s1s2 ... sk)* n ^(k-2 ) – user2445793
請有人幫忙.. – user2445793