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. 安装软件时出现error 1337 【添加权限】

    Error 1317 An error occurred while attempting to create the directory Drive Name:\Folder Name https: ...

  2. HANA SQLScript

    数据类型 日期时间类型 DATE(日期) DATE 数据类型由年.月.日信息组成,表示一个日期值. DATA 类型的默认格式为‘YYYY-MM-DD’. YYYY 表示年, MM 表示月而 DD 表示 ...

  3. leetcode题目清单

    2016-09-24,开始刷leetcode上的算法题,下面整理一下leetcode题目清单.Github-leetcode 1.基本数学 Two Sum Palindrome Number Cont ...

  4. php : 基础(3)

    运算符 算术运算符 基础: 符号有:+   -   *   /   % 说明: 他们都是针对数字进行的运算: 如果他们的两边有不是数字的数据,就会(自动)转换为数字: 其中取余运算(取模运算)%,它只 ...

  5. 插件开发--BE插件开发

    U9的插件主要分为3种,即(1)BE插件(2)UI插件(3)BP/SV插件 1.新建类库解决方案 2.新建插件类,并引用以下dll,UBF安装目录U9.VOB.Product.UBF\UBFStudi ...

  6. Android微信智能心跳方案 (转)

    原创 2015-08-17 phoenix WeMobileDev 前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和W ...

  7. 虚拟现实外包公司—焰火工坊CTO团队外包难把VR真正做起来,讲故事可能将伤害产业链

    CTO王明杨,带着他的焰火工坊,正在为自家VR播放器和系统的上线做最后准备.不少投资机构,有传言称包括小米在内巨头都试图染指VR领域,而上月上市的暴风影音正是倚靠VR的概念成功助推了其高股价.对此,王 ...

  8. c# 邮件发送功能

    //统一由一个邮箱发送录用通知 string strfrom = "";//发件人邮箱地址 string strpow = "";//邮箱密码 string s ...

  9. Javascript 知识点整理

    1.十进制和十六进制相互转换 /* 十六进制转十进制 */ var test = FF; var x = parseInt(test ,16); //方法一 x = parseInt('0x'+tes ...

  10. 【学习笔记】在原生javascript中使用ActiveX和插件

    什么是插件 现在的浏览器提供了大量的内置功能,但仍然有一些工作无法完成,如播放音频和视频.插件及其扩展浏览器功能就尤为重要. 插件是可下载的应用程序,可以插入到浏览器中,现在有很多不同的插件,常用的有 ...