原題:
題意:
n個點,任意兩個點之間可以連邊當且僅當距離不大於r,並且中間沒有其他邊。求生成樹個數。
解析:
判斷中間有沒有點可以直接n3for,也可以n2log,列舉每個點為起點,其他的點與之形成的向量用map比較是否存在即可。
連完邊就用矩陣樹進行n3做就行了。
#include
using
namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
const ll p =
10007
;const
int maxn=
309;
int x[maxn]
,y[maxn]
;bool f[maxn]
[maxn]
;ll c[maxn]
[maxn]
;ll det
(ll n)
if(c[i]
[i]==0)
return0;
ret=ret*c[i]
[i]%p;
}return
(ret+p)
%p;}
inline
void
link
(int a,
int b)
int fa[maxn]
;int
fin(
int i)
void
deal
(int n)
c[i-1]
[j-1]--
; c[i-1]
[i-1]++
; c[j-1]
[i-1]--
; c[j-1]
[j-1]++
;}}}
if(sum>1)
printf
("%lld\n"
,det
(n-1))
;}struct pair_hash
(p.first)
;auto h2 = std::hash
(p.second)
;return h1 ^ h2;}}
;int
main()
rep(i,
1,n))==
0)]=j;
}else];
double l0=
sqrt
(1.0
*(x[p0]
-x[i])*
(x[p0]
-x[i])+
1.0*
(y[p0]
-y[i])*
(y[p0]
-y[i]))
;if(l]=j;}}
}for
(auto p:m)
}deal
(n);
}}
生成樹計數
考慮簡單帶權無向圖的情況。約定這張圖為 g v,e n v m e e i u i,v i,w i 表示第 i 條邊,deg u 表示 u 所連邊的邊權和。mathbf a 滿足 mathbf a w i,j mathbf d 滿足 mathbf d i j deg i mathbf b 滿足 ma...
內向樹的生成樹計數
所謂內向樹,就是樹上的邊是由兒子指向父親 來看乙個題 元首把花園分為 nn n 行 mm m 列的網格。每個格仔中都可以放置乙個標識,指向上 下 左 右四個方向中的任意乙個。元首位於乙個格仔時,會按照其中標識所指的方向進入周圍的格仔,或者走出花園 即目的格仔不在網格之內 舉個例子 對於下面的放置方式...
無標號生成樹計數
做模擬賽的時候碰到了,感覺稍微有點意思,寫來自己看。無標號有根樹 設f n 表示樹的大小為 n 的方案數,其生成函式f z n 0f nzn。考慮生成函式的組合意義,fn 1可以由若干個無序的不同大小的 若干個無序的相同大小的本質不同的子樹 拼成,對於大小為 k 的樹,作為多棵子樹時他可以貢獻的不同...