调试了很长的时间,orz!
AC的代码,时间也蛮久的,o(╯□╰)o!
首先需要建图,然后在构建矩阵,最后求行列式的值。就这么简单,可是代码各种bug。有的大牛写了dfs函数来判断图是否连通,其实可以由Kirchhoff矩阵的性质判断图是否连通
下面是AC代码:(可以优化的)
#include <stdio.h>
#define maxn 305
#define mod 10007
int g[maxn][maxn];
int d[maxn][maxn];
int a[maxn][maxn];
int c[maxn][maxn];
int x[maxn],y[maxn];
int t,n,r;
bool less_r(int x1,int y1,int x2,int y2)
{
if((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r * r) return true;
else return false;
}
bool ok(int x1,int y1,int x2,int y2,int x0,int y0)
{
int min_x,max_x;
int min_y,max_y;
if(x1 <= x2) min_x = x1,max_x = x2;
else min_x = x2,max_x = x1;
if(y1 <= y2) min_y = y1,max_y = y2;
else min_y = y2,max_y = y1;
if(x0 >= min_x && x0 <= max_x && y0 >= min_y && y0 <= max_y)
{
if((x1 - x0) * (y2 -y1) == (x2 - x1) * (y1 - y0)) return true;
}
return false;
}
void build_graph()
{
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(less_r(x[i],y[i],x[j],y[j]))
{
bool flag = true;
for(int k = 0; k < n; k++)
{
if(i != k && j != k)
{
if(ok(x[i],y[i],x[j],y[j],x[k],y[k]))
{
flag = false;
break;
}
}
}
if(flag) g[i][j] = 1;
}
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(g[i][j])
{
d[i][i]++;
d[j][j]++;
a[i][j] = 1;
a[j][i] = 1;
}
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++) c[i][j] = d[i][j] - a[i][j];
}
}
int det(int n)
{
int ans = 1;
int coe = 1;
bool tag = true;
int i,j,k;
for(i = 0; i < n; i++)
{
if(c[i][i] == 0)
{
for(j = i + 1; j < n; j++)
{
if(c[j][i]) break;
}
if(j == n) return 0;
tag = !tag;
for(k = i; k < n; k++)
{
int temp = c[j][k];
c[j][k] = c[i][k];
c[i][k] = temp;
}
}
for(j = i + 1; j < n; j++)
{
if(c[j][i])
{
int mul = c[j][i];
coe *= c[i][i];
coe %= mod;
for(k = i; k < n; k++)
{
c[j][k] = (c[j][k] * c[i][i] - c[i][k] * mul) % mod;
if(c[j][k] < 0) c[j][k] += mod;
}
}
}
}
for(i = 0; i < n; i++)
{
ans *= c[i][i];
ans %= mod;
}
for(i = 1; i < mod; i++)
{
if((coe * i) % mod == ans)
{
ans = i;
break;
}
}
if(!tag) ans = mod - ans;
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&r);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
g[i][j] = 0;
d[i][j] = 0;
a[i][j] = 0;
c[i][j] = 0;
}
}
for(int i = 0; i < n; i++) scanf("%d%d",&x[i],&y[i]);
build_graph();
int ans = det(n-1);
if(ans == 0) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}