生成树计数
HDU 4305题目链接
题意
给出n个点的坐标,距离不超过r的点如果中间没有其它点则可以连一条边,最后求生成树的数量,对10007取模。
思路
首先将点排序,利用map判断是否已有斜率存在,建图之后就是直接套模板即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <utility>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 333;
const int mod = 10007;
struct point{
int x,y;
bool operator < (const point &k){
if (x == k.x) return y < k.y;
return x < k.x;
}
}p[N];
ll K[N][N];
map<pair<int,int>,int> mp;
ll det(int n) /// 求矩阵K的n-1阶顺序主子式
{
ll ans = 1;
for (int i = 1; i < n; i++){
/// 枚举主对角线上第i个元素
for (int j = i + 1; j < n; j++){
/// 枚举剩下的行
while(K[j][i]){
///辗转相除
ll tem = K[i][i] / K[j][i];
for (int k = i; k < n; k++){
///转为倒三角
K[i][k] = (K[i][k] - tem * K[j][k] % mod) % mod;
}
for (int k = i; k < n; k++){
///交换i、j两行
swap(K[i][k],K[j][k]);
}
ans = -ans; ///取负
}
}
if (K[i][i] == 0) return 0;
ans = (ans * K[i][i]) % mod;
}
return ((ans % mod) + mod) % mod;
}
double dis(int i,