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;}
- Hdu 4305 Lightning - 生成树计数 - 行列式求值
- hdu - 4305 - Lightning 生成树计数
- HDU 4305 Lightning (矩阵行列式求生成树个数+高斯逆元求行列式模板)
- hdu 4305 Lightning(生成树计数 取模)
- HDOJ 4305 Lightning 生成树计数
- HDU 4305 Lightning (生成树的计数+矩阵树定理+逆元)
- HDU 4305 Lightning (判断点在线段上,生成树计数)
- HDU 4305 Lightning(判断点在线段上+生成树计数)
- HDU 6064 RXD and numbers(生成树计数+行列式)
- hdu4305 Lightning 几何,生成树计数
- Lightning----HDU_4305----生成树的计数----矩阵树定理
- hdu 4305 生成树计数
- BZOJ 1002 轮状病毒 生成树计数(行列式递推)
- HDU 4305 Lightning
- HDU 4305 Lightning
- HDU 4305 Lightning
- HDU --- 4305 Lighting 【生成树计数 + 向量 】
- 行列式求值
- PV,VG,LV的关系和操作
- JavaFX中的ObservableValue类型
- 敏捷在业界成功了吗?
- 如何在关闭vim文件后,屏幕上还显示之前文件的内容
- python中的sum函数.sum(axis=1)
- Hdu 4305 Lightning - 生成树计数 - 行列式求值
- 页码js,支持ajax无刷新翻页
- -all_load -force_load -ObjC
- glPolygonOffset的用法
- java RMI原理解析
- OCP-1Z0-053-V13.02-443题
- Apache的rewrite规则详细介绍
- hdu 1425 sort
- C++深入体验之旅一:C++概述