HDU 4305(生成樹計數)

2022-05-24 15:09:10 字數 1694 閱讀 2599

2015-09-07 22:23:26

【傳送門】

題意:平面上300個點,如果兩點之間距離<=r,且兩點形成的線段上沒有另外的點,那麼兩點之間有一條無向邊。問生成樹的方案數。

思路:暴力n^2建圖,關於判斷兩點形成線段上是否有其他點,比如判斷 k 點知否在 i ,j 之間,首先看斜率是否相等,不能直接求斜率,而應該轉化為乘式;再判斷 dis(i,k)+dis(k,j)是否等於 dis(i,j),如果斜率一樣且距離相等那麼 k 點在 i,j 之間。

建完圖後就是matrix-tree定理的運用了,注意取模。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define getmid(l,r) ((l) + ((r) - (l)) / 2)

#define mp(a,b) make_pair(a,b)

#define pb push_backtypedef

long

long

ll;typedef pair

pii;

const

double eps = 1e-8

;const

int inf = (1

<< 30) - 1

;const

int maxn = 310

;const

int mod = 10007

;int

t;int

n,r;

intx[maxn],y[maxn];

double

dis[maxn][maxn];

intg[maxn][maxn];

intvis[maxn];

int sign(double

x)double dis(int a,int

b)void dfs(int

p)int det(int

n) }

if(!a[i][i]) return0;

res = res * a[i][i] %mod;

}return (res + mod) %mod;

}int

main()

}memset(g,

0,sizeof

(g));

for(int i = 1; i <= n; ++i)

}if(can)}}

memset(vis,

0,sizeof

(vis));

dfs(1);

bool flag = true

;

for(int i = 1; i <= n; ++i) if(!vis[i]) flag = false

;

if(!flag)

int ans = det(n - 1

); printf(

"%d\n

",ans);

}return0;

}

uva 10766 生成樹計數

給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。這道題的k沒有什麼用。include include include include include include include include include incl...

清華集訓2017 生成樹計數

在乙個 s 個點的圖中,存在 s n 條邊,使圖中形成了 n 個連通塊,第 i 個連通塊中有 a i 個點。現在我們需要再連線 n 1 條邊,使該圖變成一棵樹。對一種連邊方案,設原圖中第 i 個連通塊連出了 d i 條邊,那麼這棵樹 t 的價值為 mathrm t left prod m right...

uva10766生成樹計數

此類題是給定乙個無向圖,求所有生成樹的個數,生成樹計數要用到matrix tree定理 kirchhoff矩陣 樹定理 g的度數矩陣d g 是乙個n n的矩陣,並且滿足 當i j時,dij 0 當i j時,dij等於vi的度數 g的鄰接矩陣a g 也是乙個n n的矩陣,並且滿足 如果vi vj之間有...