kuangbin專題八 UVA10766 (生成樹計數)Organising the Organisation(請無視這篇文章)
題意:
給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。另外,這道題的k可以忽略掉,所以他的範圍完全是嚇唬人的。
題解:
抱歉,這道題我真的無法弄的通俗的說出來,因為這個設計線性代數,我線性代數考試的時候完全是臨時抱佛腳的,導致我不太弄懂怎麼個弄法,儘管是那個道理,那個意思,但是感覺矩陣沒好好懂,還是不明白,所以這篇文章就當是給我自己看的,請大家繞道而行去看別的好的部落格。
大佬的解說:
生成樹計數:基爾霍夫矩陣樹定理
無向圖的基爾霍夫矩陣: 對角線上表示每個點的度數,若ij之間有邊則矩陣ij處為-1
無向圖的生成樹的數目為: 任意一個n-1階主子式的行列式的絕對值.
思路:
參考周冬的《生成樹的計數及其應用》。就是Matrix-Tree定理的應用。
對於一個無向圖G,它的生成樹個數等於其Kirchhoff矩陣任何一個n-1階主子式的行列式的絕對值。
所謂n-1階主子式,就是對於任意一個r,將C的第r行和第r列同時刪去後的新矩陣,用Cr表示。
Kirchhoff矩陣:對於無向圖G,它的Kirchhoff矩陣C定義為它的度數矩陣D減去它的鄰接矩陣A。
題外話:
操,之前參考的那個模板是錯誤的,只是過了這道題,換個題目就不行,坑了我一上午,去用別的模板就過了,看了假部落格是真的難受啊。。操,現在就換過來
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long int
const int MAXN=55;
LL A[MAXN][MAXN];
LL B[MAXN][MAXN];
LL determinant(int n)
{
LL res=1;
for(int i=1;i<=n;i++)
{
if (!B[i][i])
{
bool flag=false;
for(int j=i+1;j<=n;j++)
{
if(B[j][i])
{
flag=true;
for(int k=i;k<n;k++)
{
swap(B[i][k],B[j][k]);
}
res=-res;
break;
}
}
if(!flag)
return 0;
}
for(int j=i+1;j<=n;j++)
{
while(B[j][i])
{
LL t=B[i][i]/B[j][i];
for(int k=i;k<=n;k++)
{
B[i][k]=B[i][k]-t*B[j][k];
swap(B[i][k],B[j][k]);
}
res=-res;
}
}
res*=B[i][i];
}
return res;
}
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))//這個k沒卵用,完全可以無視
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
A[a][b]=A[b][a]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&!A[i][j])
{
B[i][i]++;
B[i][j]=-1;//減去鄰接矩陣
}
}
}
n=n-1;
LL ans=determinant(n);
printf("%lld\n",ans);
}
}
相關推薦
kuangbin專題八 UVA10766 (生成樹計數)Organising the Organisation(請無視這篇文章)
題意: 給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。另外,這道題的k可以忽略掉,所以他的範圍完全是嚇唬人的。 題解: 抱歉,這道題我真的無法弄的通俗的說出來
kuangbin專題八 URAL1627 Join(生成樹計數)
題意: 給出一個圖,’.’表示臥室,’*’表示儲藏間,每個格子上下左右都有一堵牆,然後需要打通一些臥室的牆(只能是相鄰房間才能打通)使得臥室之間聯通的方案數. 給每個臥室編個號,給可以打通的臥室加邊,就是裸的生成樹計數了. 題解: 打通一
UVA 10766 Organising the Organisation(生成樹計數 不取模)
Problem H Organising the Organisation Input: Standard Input Output: Standard Output Time Limit: 2 Second I am the chief of the Personne
kuangbin專題八生成樹總結
總結:生成樹的知識點真多,不過博主覺得圖論的題目終究是建圖難,第一步就是如何建圖,將其轉換成已知的問題。 另外,關於生成樹的兩個注意點,也是為了防止碰到毒瘤題。一就是自環,二就是重邊。 A - The Unique MST 次小生成樹裸題。 prim模板
uva10766生成樹計數
als mes art 算子 技術分享 math 個數 main mat 此類題是給定一個無向圖,求所有生成樹的個數,生成樹計數要用到Matrix-Tree定理(Kirchhoff矩陣-樹定理) G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i
BZOJ1494: [NOI2007]生成樹計數(Berlekamp-Massey演算法)
傳送門 題解: 直接打表+BM算出遞推式,BM具體實現可以戳這裡 附上一份其醜無比的BM程式碼: const int L=4e2; namespace bm { int cnt,a[N],fail[N],delta[N]; vector <int> R[N]
hdu4305Lightning 生成樹計數(基爾霍夫矩陣)+高斯消元+逆元
題意:比較裸的生成樹計數問題。 如何處理生成樹計數問題? 基爾霍夫矩陣: if i==j Kir[i][j] = i的度數 if i!=j Kir[i][j] = i到j的平行邊的個數的負數 即,基爾霍夫矩陣 = 度數矩陣 - 鄰接矩陣 將基爾霍夫矩陣刪去第i
生成樹計數(Matrix-Tree定理)
以下轉載自http://blog.csdn.net/jarily/article/details/8901363 /* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:
UVA10766(Organising the Organisation)生成樹計數-Matrix-Tree定理
/* *題目地址: *http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1707; * *題目大意:
【BZOJ1494】【NOI2007】生成樹計數(動態規劃,矩陣快速冪)
題面 Description 最近,小棟在無向連通圖的生成樹個數計算方面有了驚人的進展,他發現: ·n個結點的環的生成樹個數為n。 ·n個結點的完全圖的生成樹個數為n^(n-2)。這兩個發現讓小棟欣喜若狂,由此更加堅定了他繼續計算生成樹個數的 想法,他
HDU 4305 Lightning (生成樹的計數+矩陣樹定理+逆元)
題意:給你n個點,如果兩個點的距離小於等於r那麼就連一條邊,讓你求生成樹的個數。 題解: 對於無向圖G,它的Kirchhoff矩陣C定義為它的度數矩陣D減去它的鄰接矩陣A。顯然,這樣的定義滿足剛才描述的性質。 有了Kirchhoff矩陣這個工具,我們可以引入Matri
hdu4305生成樹計數
open assert with for def com false tor == 先預處理出距離,然後判斷是否可行,要註意判斷是否在一條直線上時判斷是在兩側還是一邊(wa了四次) double型數據 #include<map> #include<se
生成樹計數及應用 Matrix-Tree
log blog 生成樹計數 mathjax 插值 tps 生成樹 www. 應用 例:給定一個圖,圖上每條邊是紅色或藍色,求恰有 k 條紅邊的生成樹個數. n≤50. Matrix-Tree定理,對於限制條件可以利用多項式,把紅邊邊權設為 X,藍邊為1. 最後求行列式得到
STP(生成樹協議)--學習筆記
STP(生成樹協議)--學習筆記一·STP STP協議在邏輯上斷開網絡的環路,防止廣播風暴的產生,而一旦正在使用的線路出現故障,邏輯上被斷開的線路又被連同,起到了冗余備份的作用。解決二層環路的問題。 二·生成樹工作原理 生成樹協議的算法過程可以歸納為三個步驟:選擇根網橋、選擇根端口、選擇指定端口。 (1)選
【LOJ】#2320. 「清華集訓 2017」生成樹計數
rac res 然而 除了 加法 wap OS 代碼 reg 題解 我,理解題解,用了一天 我,卡常數,又用了一天 到了最後,我才發現,我有個加法取模,寫的是while(c >= MOD) c -= MOD 我把while改成if,時間,少了 六倍。 六倍。 六倍!!
Gym-101630C:Connections(生成樹&構造)
int conn namespace std size long long 生成 class ons 題意:給定N點,M條有向邊,滿足任意點可以到達任意點。現在叫你保留2*N邊,任然滿足任意點可以到達任意點,輸出刪除的邊。 思路:從1出發,DFS,得到一顆生成樹,有N-1
[BZOJ1494]生成樹計數
cto operator 個數 最後一行 判斷 state for break desc [BZOJ1494] [NOI2007]生成樹計數 Description 最近,小棟在無向連通圖的生成樹個數計算方面有了驚人的進展,他發現:·n個結點的環的生成樹個數為n。·n個結點
bzoj1494 生成樹計數 (dp+矩陣快速冪)
sets 增加 set 基本 表示 2種 least 欺詐 main 題面欺詐系列... 因為一個點最多只能連到前k個點,所以只有當前的連續k個點的連通情況是對接下來的求解有用的 那麽就可以計算k個點的所有連通情況,dfs以下發現k=5的時候有52種。 我們把它們用類似於並
[生成樹計數]
prufer序列 每個prufer序列對應一棵唯一的樹。 生成:得到一棵樹的prufer序列的方法是依次去掉編號最小的葉子節點(也就是度數為1的點),然後將這個點的父親加入佇列。直到剩下最後兩個點。這樣就可以得到一個長度為n的prufer序列。 根據prufer序列的生成方式可以得到:每個節點會在pru
計蒜客:灌溉(生成樹)
https://nanti.jisuanke.com/t/34 到了旱季農業生產的灌溉就成了一個大問題。為了保證灌溉的順利,某縣政府決定投資為各個村之間建立灌溉管道。 輸入第1行包括一個整數N,表示某縣的村莊的數量。(3≤N≤100),第2行-結尾為一個N×N的矩陣,表示每個村莊之間的距