1627. Join
http://acm.timus.ru/problem.aspx?space=1&num=1627
给一个无向图,问可以有多少生成树
参照 周冬《生成树的计数及其应用》
代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner; class Fraction {
public BigInteger x;
public BigInteger y; public Fraction(int xx, int yy) {
x = BigInteger.valueOf(xx);
y = BigInteger.valueOf(yy);
} static public BigInteger gcd(BigInteger x, BigInteger y) { if (x.mod(y).compareTo(BigInteger.ZERO) == 0) {
return y;
} else {
return gcd(y, x.mod(y));
}
} public Fraction add(Fraction f) {
Fraction ff = new Fraction(0, 1);
ff.y = this.y.multiply(f.y);
ff.x = this.x.multiply(f.y).add(this.y.multiply(f.x));
BigInteger z = Fraction.gcd(ff.x, ff.y);
ff.x = ff.x.divide(z);
ff.y = ff.y.divide(z);
return ff;
} public Fraction subtract(Fraction f) {
Fraction ff = new Fraction(0, 1);
ff.y = this.y.multiply(f.y);
ff.x = this.x.multiply(f.y).subtract(this.y.multiply(f.x));
BigInteger z = Fraction.gcd(ff.x, ff.y);
ff.x = ff.x.divide(z);
ff.y = ff.y.divide(z);
return ff;
} public Fraction multiply(Fraction f) {
Fraction ff = new Fraction(0, 1);
ff.y = this.y.multiply(f.y);
ff.x = this.x.multiply(f.x);
BigInteger z = Fraction.gcd(ff.x, ff.y);
ff.x = ff.x.divide(z);
ff.y = ff.y.divide(z);
return ff;
} public Fraction divide(Fraction f) {
Fraction ff = new Fraction(0, 1);
ff.y = this.y.multiply(f.x);
ff.x = this.x.multiply(f.y);
BigInteger z = Fraction.gcd(ff.x, ff.y);
ff.x = ff.x.divide(z);
ff.y = ff.y.divide(z);
if (ff.y.compareTo(BigInteger.ZERO) < 0) {
ff.y = ff.y.abs();
ff.x = ff.x.multiply(BigInteger.valueOf(-1L));
}
return ff;
} public boolean equals(Fraction f) {
if (this.x.equals(f.x) && this.y .equals(f.y)) {
return true;
}
return false;
} } public class Main { /**
* @param args
* @throws FileNotFoundException
*/
public static int N = 100; public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
Fraction[][] a = new Fraction[N][N]; for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
a[i][j] = new Fraction(0, 1);
}
}
int[][] k = new int[N][N];
int[] X = { 0, 0, -1, 1 };
int[] Y = { 1, -1, 0, 0 }; int n = in.nextInt();
int m = in.nextInt();
int ln = 0;
for (int i = 0; i < n; ++i) {
String s = in.next();
for (int j = 0; j < m; ++j) {
if (s.charAt(j) == '.') {
k[i][j] = (++ln);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (k[i][j] > 0) {
for (int w = 0; w < 4; ++w) {
int x = i + X[w];
int y = j + Y[w];
if (x >= 0 && x < n && y >= 0 && y < m && k[x][y] > 0) {
a[k[i][j]][k[x][y]] = new Fraction(-1, 1);
a[k[i][j]][k[i][j]] = a[k[i][j]][k[i][j]]
.add(new Fraction(1, 1));
}
}
}
}
}
if (ln > 1) {
System.out.println(valueOfMatrix(a, ln - 1));
}else{
System.out.println(1);
}
} public static BigInteger valueOfMatrix(Fraction[][] a, int n) {
// TODO Auto-generated method stub
BigInteger MOD = BigInteger.valueOf(1000000000L);
dfs(a, n);
Fraction v = new Fraction(1, 1);
for (int i = 1; i <= n; ++i) {
v = v.multiply(a[i][i]);
}
return v.x.mod(MOD);
} public static void dfs(Fraction[][] a, int n) {
if (n == 1)
return;
int l = n;
Fraction fractionZORE = new Fraction(0, 1);
while (l >= 1 && a[l][n].equals(fractionZORE)) {
--l;
}
if (l < 1) {
dfs(a, n - 1);
} else {
if (l < n) {
for (int j = 1; j <= n; ++j) {
Fraction z = a[l][j];
a[l][j] = a[n][j];
a[n][j] = z;
}
} for (int i = 1; i < n; ++i) {
if (!a[i][n].equals(fractionZORE)) {
Fraction z = a[i][n].divide(a[n][n]);
for (int j = 1; j <= n; ++j) {
a[i][j] = a[i][j].subtract(a[n][j].multiply(z));
}
}
}
dfs(a, n - 1);
}
} }
1627. Join的更多相关文章
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数
第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- URAL - 1627:Join (生成树计数)
Join 题目链接:https://vjudge.net/problem/URAL-1627 Description: Businessman Petya recently bought a new ...
- SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...
- Nested Loops join时显示no join predicate原因分析以及解决办法
本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...
- c# Enumerable中Aggregate和Join的使用
参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaochen ...
随机推荐
- 20161127-adt bundle
1.adt.exe 路径:E:\software\adt-bundle-windows-x86-20131030\sdk\platform-tools\adt.exe 配置环境变量 命令: adb d ...
- CSS 选择器
1. . ==> class选择器 2. # ==> id选择器 3. * ==>选择所有元素 4.<p> ==>选择所有<p>标签的元 ...
- Kanzi编程基础3 - 图片读取与显示
Kanzi开发的时候会遇到需要从外部读取图片的情况.Kanzi2.8版本和3.3版本读取方法稍有不同,我们先看看2.8版本的api. [2.8版本] 1)首先要从文件中读取一张图片 struct Kz ...
- 《与小卡特一起学Python》 Code2
下边是一个猜数字的小游戏: 几乎所有语言都这样做的…… here we go! import random secret = random.randint(1,99) guess = 0 tries ...
- 剑指offer六:反转链表
输入一个链表,反转链表后,输出链表的所有元素 public class ListNode { int val; ListNode next = null; ListNode(int val) { th ...
- 【树莓派】【转】利用USB网卡配置树莓派为无线热点
由于Wifi很慢,基本不可用:树莓派有无线网卡,恰好看到有文章用树莓派来做无线热点,利用树莓派来共享无线网络.比较有用,转发后续尝试. 本文转自:https://www.embbnux.com/201 ...
- js 睡觉
js睡觉 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMilli ...
- codeigniter nginx配置
转载:http://www.nginx.cn/1134.html server{ listen 80; server_name www.ci.oa.com; access_log /usr/local ...
- JavaScript中的数组遍历forEach()与map()方法以及兼容写法
原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...
- 深入学习 celery
一.amqp交换 参考链接: http://www.cnblogs.com/ajianbeyourself/p/4950758.html