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的更多相关文章

  1. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  2. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

  3. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  4. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

  5. URAL - 1627:Join (生成树计数)

    Join 题目链接:https://vjudge.net/problem/URAL-1627 Description: Businessman Petya recently bought a new ...

  6. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

  7. 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. ...

  8. Nested Loops join时显示no join predicate原因分析以及解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...

  9. c# Enumerable中Aggregate和Join的使用

    参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaochen ...

随机推荐

  1. 公钥私钥和RSA算法

    1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...

  2. Command调用存储过程小实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  3. java web使用gradle配置详情

    博客说明:本片博客为FSSARB项目片面部分,目前项目还在更新中,请持续关注... 序言 项目构建工具从ant到maven,再到gradle,这是在严峻的技术考验下不停过度的结果.依照百度百科的阐述, ...

  4. html5移动端知识点总结

    第一章,控制html字体大小 1.1使用媒体查询,不同分辨率设置不同的html的font-size   @(min-width:320px){ html{font-size:10px;} } @(mi ...

  5. NSJSONSerialization(json序列化)

    //通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据 NSJSONSerialization isValidJSONObject:obj 我们能利用N ...

  6. 运行 Spark on YARN

    运行 Spark on YARN Spark 0.6.0 以上的版本添加了在yarn上执行spark application的功能支持,并在之后的版本中持续的 改进.关于本文的内容是翻译官网的内容,大 ...

  7. 解决httpServletRequest.getParameter获取不到参数

    用httpServletRequest.getParameter接收post请求参数,发送端content Type必须设置为application/x-www-form-urlencoded:否则会 ...

  8. Node聊天程序实例03:chat.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat.j ...

  9. 专为控制打印设计的CSS样式

    大多数Web设计师对打印控制还不是很熟悉,他们往往更迷恋像素,而不是打印机.在现实世界中,很多人依赖从网站上打印网页来参考: 在这个数字时代, 在一些特殊的场合,很多人手中还会拿着纸张.Web开发人员 ...

  10. Hadoop中wordcount程序

    一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...