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之間有...