Ural 1627 Join(生成树计数)

http://acm.timus.ru/problem.aspx?space=1&num=1627

  生成树计数的题,直接用Matrix-Tree定理就可以解决问题了。

代码如下:

View Code
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 const int maxSize = 100;
  8 const int initMod = 1e9;
  9 typedef long long ll;
 10 int curSize = maxSize;
 11 
 12 struct Mat {
 13     ll val[maxSize][maxSize];
 14 
 15     Mat (ll one = 0) {
 16         for (int i = 0; i < curSize; i++) {
 17             for (int j = 0; j < curSize; j++) {
 18                 val[i][j] = 0;
 19             }
 20             val[i][i] = one;
 21         }
 22     }
 23 
 24     void print() {
 25         for (int i = 0; i < curSize; i++) {
 26             for (int j = 0; j < curSize; j++) {
 27                 printf("%lld ", val[i][j]);
 28             }
 29             puts("");
 30         }
 31         puts("~~~");
 32     }
 33 } mat;
 34 
 35 const int maxn = 12;
 36 char mp[maxn][maxn];
 37 
 38 void convert(int l, int r) {
 39     int mark = 0;
 40 
 41     for (int i = 0; i < l; i++) {
 42         for (int j = 0; j < r; j++) {
 43             mp[i][j] = (mp[i][j] == '.') ? ++mark : 0;
 44         }
 45     }
 46 //    printf("mark %d\n", mark);
 47 
 48     curSize = mark + 1;
 49     mat = Mat();
 50 
 51     for (int i = 0; i < l; i++) {
 52         for (int j = 0; j < r; j++) {
 53             if (!mp[i][j]) continue;
 54             if (i && mp[i - 1][j]) {
 55                 mat.val[mp[i][j]][mp[i - 1][j]]--;
 56                 mat.val[mp[i][j]][mp[i][j]]++;
 57             }
 58             if (j && mp[i][j - 1]) {
 59                 mat.val[mp[i][j]][mp[i][j - 1]]--;
 60                 mat.val[mp[i][j]][mp[i][j]]++;
 61             }
 62             if (i != l - 1 && mp[i + 1][j]) {
 63                 mat.val[mp[i][j]][mp[i + 1][j]]--;
 64                 mat.val[mp[i][j]][mp[i][j]]++;
 65             }
 66             if (j != r - 1 && mp[i][j + 1]) {
 67                 mat.val[mp[i][j]][mp[i][j + 1]]--;
 68                 mat.val[mp[i][j]][mp[i][j]]++;
 69             }
 70         }
 71     }
 72 //    puts("~~~");
 73 //    mat.print();
 74 }
 75 
 76 ll gcd(ll a, ll b) {
 77     return b ? gcd(b, a % b) : a;
 78 }
 79 
 80 ll lcm(ll a, ll b) {
 81     return a / gcd(a, b) * b;
 82 }
 83 
 84 ll cal() {
 85     ll ret = 1ll;
 86 
 87     curSize--;
 88     for (int p = 1, i, j; p < curSize; p++) {
 89         for (i = p + 1; i < curSize; i++) {
 90             while (mat.val[i][p]) {
 91                 int tmp = mat.val[p][p] / mat.val[i][p];
 92 
 93                 for (j = p; j < curSize; j++) {
 94                     mat.val[p][j] = ((mat.val[p][j] - mat.val[i][j] * tmp) % initMod + initMod) % initMod;
 95                     swap(mat.val[i][j], mat.val[p][j]);
 96                 }
 97                 ret = -ret;
 98             }
 99         }
100         ret *= mat.val[p][p];
101         ret = (ret % initMod + initMod) % initMod;
102 //        mat.print();
103     }
104 
105     return ret;
106 }
107 
108 int main() {
109 //    freopen("in", "r", stdin);
110 //    freopen("out", "w", stdout);
111     int n, m;
112 
113     while (~scanf("%d%d", &n, &m)) {
114         for (int i = 0; i < n; i++) {
115             scanf("%s", mp[i]);
116         }
117         convert(n, m);
118         printf("%lld\n", cal());
119     }
120 
121     return 0;
122 }

 

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/10/29/Ural_1627_Lyon.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

repair filesystem 一般是什么引起的和该怎样解决

repair filesystem 一般是什么引起的和该怎样解决 linux下repair filesystem模式修复方法实践 第一种情况&#xff1a;非正常关机引起的磁盘分区问题不能正常进入系统 如果确定是由于上次非正常关机或者异常断电引起的&#xff0c;可以使用fsck /dev/hdaX后reboot进入&#xff…

Navicat for MySQL工具创建mysql数据库定时器

步骤1&#xff1a; 步骤二&#xff1a; 效果图:

centos安装virtualbox

1 检查系统内核版本[rootcentos ~]# uname -aLinux centos2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i686 i686 i386 GNU/Linux2 安装软件环境yum install gcc yum install kernel-devel yum install kernel-headers 注&#xff1a;这步执行后的版kernel-devel和kern…

带有emplace开头的STL为何优于其它插入函数

#include #include #include “my_string.h” int main() { std::vector<my_string>vec; //会执行构造函数&#xff0c;再执行move构造函数,如果没有move会自己生成默认的move构造函数 vec.push_back(“1111”); //c会执行构造&#xff0c;执行完毕 std::string str …

openssl rsa密钥

#include <boost/asio/ssl.hpp> #include #if defined(WINDOWS) #if (OPENSSL_VERSION_NUMBER > 0x10101000L) #pragma comment(lib,“libcrypto.lib”) #pragma comment(lib,“libssl.lib”) #else #pragma comment(lib,“libeay32.lib”) #pragma comment(lib,“ss…

Juniper基础系列之一---vlan的建立

VLAN是交换机最重要的一个功能。EX交换机关于VLAN配置的菜单有三层&#xff0c;首先是vlans菜单层次&#xff0c;在vlans&#xff08;通过edit vlans可以进入vlans菜单里面&#xff09;里面可以创建vlan&#xff0c;而创建vlan的时候可以指定名字和vlan id。 在EX端口下面&…

魔兽争霸3地图(WarIII Maps):三国猛兽传

魔兽争霸3地图&#xff08;WarIII Maps&#xff09;&#xff1a;三国猛兽传三国猛兽传三国时期&#xff0c;连年战乱&#xff0c;天降异象&#xff0c;所有战力无双的英雄&#xff0c;外表全都变成了凶悍的猛兽…………其貌虽毁&#xff0c;其心不改攻城略地&#xff0c;百战成…

Linux下Redis的安装、配置操作说明

Redis 是一个高性能的key-value数据库。 redis的出现&#xff0c;很大程度补偿了memcached这类keyvalue存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用。它提供了Python&#xff0c;Ruby&#xff0c;Erlang&#xff0c;PHP客户端&#xff0c;使用很方便。…

提取ip和端口

#include int main() { std::string str “192.168.9:8086”; std::string buffer1; buffer1.resize(128); int port 0; sscanf(str.c_str(), “%[^:]:%d”, &buffer1[0],&port); //std::string str “https://192.168.9:8086/test”; //std::string buffer1; //b…

Oracle SQL语句执行步骤

Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1、当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息&#xff08;如下图&#xff09;&#xff0c;这过程会花比较长的时间&#xff0c;因为它要分…

字节流及字节对齐

#include #pragma pack(push,4) struct MyStruct { unsigned char a;// unsigned int b; //到这里是&#xff0c;加起来等于unsigned int 字节的倍数 unsigned char Cbuffer[10];//char没有字节对齐 unsigned int d; }; #pragma pack() void EnCodePack(unsigned char*cSend…

Android平台各类恶意软件及病毒概览

原文请见:http://mobile.51cto.com/ahot-364267.htmAndroid平台中各类恶意软件及病毒概览<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />随着移动互联网的发展&#xff0c;作为当今最大的移动操作系统之一&#xff0c;Android已…

string封装

class String { public: String(const char*str NULL) { if (str NULL) { data_ new char[1]; data_[0] 0; //memset(data_, 0, sizeof(data_)); //数组越界&#xff0c;delete的时候&#xff0c;会影响内存回收变化&#xff0c;因此会导致程序崩溃 } else { data_ new ch…

vim高级技巧(split)_小花_新浪博客

vim高级技巧&#xff08;split&#xff09;_小花_新浪博客:res(ize) N 把当前窗口高度增加N个像素 :res(ize) -N 把当前窗口高度减少N个像素 :vertical res(ize) N 把当前窗口宽度增加N个像素 :vertical res(ize) -N 把当前窗口宽度减少N个像素等于是按下后,松开键盘,再按…

单链表反转和插入

#include struct node { int value -1; node* next_ptr nullptr; }; //创建结点 void create(int i, node** header_ptr) { node* current header_ptr; //第一个结点 if (current nullptr) { node ptr new node; ptr->value i; ptr->next_ptr nullptr; header…

liunx命令联系

1&#xff0c;liunx桌面和命令行之间的切换 init 3 init4 init5 2&#xff0c;liunx下用户的切换是su 用户 转载于:https://blog.51cto.com/lvjian118/1057319

测试boot库下I/O模型类型

#include #include #include <boost/asio.hpp> int main() { std::string output; #if defined(BOOST_ASIO_HAS_IOCP) output “iocp” ; #elif defined(BOOST_ASIO_HAS_EPOLL) output “epoll” ; #elif defined(BOOST_ASIO_HAS_KQUEUE) output “kqueue” ; #elif…

循环语句:For循环

Pascal中的for循环严格地建立在计数器基础上&#xff0c;循环每执行一次&#xff0c;计数器不是增加一个值就是减小一个值。 例子&#xff1a; vark,i: integer; beginK:0;for i:1 to 10 dok :ki;同样的for语句可以用正好相反的计数器来写&#xff1a; vark,i: integer; begink…

beast单元库的总结

1:凡是带有async_read 和async_write 开头都是阻塞的&#xff0c;因为在向socket底层读写缓冲区时&#xff0c;一定要读完指定的大小位置&#xff0c;因为底层写了一个for循环 2:如果要使用async_read_some开头的函数&#xff0c;一定要使用先读写包头&#xff0c;再读写包体的…

Ubuntu 找不到libc.so.6

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 上&#xff0c;其实这个库是存在的&#xff0c;只是地方换了&#xff0c;在"/lib/i386-linux-gnu/"下面&#xff0c;我们只需创建一个链接即可。使用下面的命令&#xff1a; rootubuntuJack:/lib/i3…