Hdu 4305 Lightning - 生成树计数 - 行列式求值

来源:互联网 发布:linux默认命令行启动 编辑:程序博客网 时间:2024/05/21 11:00

调试了很长的时间,orz!

AC的代码,时间也蛮久的,o(╯□╰)o!

首先需要建图,然后在构建矩阵,最后求行列式的值。就这么简单,可是代码各种bug。有的大牛写了dfs函数来判断图是否连通,其实可以由Kirchhoff矩阵的性质判断图是否连通

下面是AC代码:(可以优化的)

#include <stdio.h>#define maxn 305#define mod 10007int 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;}