Eastest Magical Day Seep Group's Summer

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 308    Accepted Submission(s): 83

Problem Description
As we know, Tsuyuri Kumin likes sleeping in Eastest magical day sleep group's summer. But Rikka wants Kumin to play games with her. So she comes up with one problem:



Here is an undirected graph G
with n
vertices and m
edges. Now you need to delete m−n
edges and to make sure that the remain graph is connected. Rikka wants you to tell her the number of ways to choose the edges.



Kumin wants to go to sleep, so she asks you to answer this question. Can you help her?
 
Input
There are at most 100 testcases。and there are no more 5 testcases withn≥10.



For each test case, the first line contains two integers
n,m (1≤n≤16,n≤m≤n(n−1)2).



Then m
lines follows. Each of them contains two integers
ui,vi,
meaning that there is an edge between ui
and vi.
It is guaranteed that the graph doesn't contain self loops or multiple edges.
 
Output
For each testcase print a single integer - the number of ways to choose the edges. The answer may be very large, so you only need to print the answer modulo 998244353.
 
Sample Input
4 5
1 2
2 3
3 4
4 1
1 3
 
Sample Output
5
 
Author
XJZX
 
Source
 
Recommend
wange2014   |   We have carefully selected several similar problems for you:  

pid=5405">5405 5404 

pid=5403">5403 5402 5401 

 
  1. Kirchhoff矩阵

     *(1)G的度数矩阵D[G]是一个n*n的矩阵,而且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数;
  2. *(2)G的邻接矩阵A[G]是一个n*n的矩阵,而且满足:假设vi,vj之间有边直接相连,则aij=1,否则为0;
  3. *定义图G的Kirchhoff矩阵C[G]为C[G]=D[G]-A[G];
  4. *Matrix-Tree定理:G的全部不同的生成树的个数等于其Kirchhoff矩阵C[G]不论什么一个n-1阶主子式的行列式的绝对值;
  5. *所谓n-1阶主子式,就是对于r(1≤r≤n),将C[G]的第r行,第r列同一时候去掉后得到的新矩阵,用Cr[G]表示;
  6. *
  7. *Kirchhoff矩阵的特殊性质:
  8. *(1)对于不论什么一个图G,它的Kirchhoff矩阵C的行列式总是0,这是由于C每行每列全部元素的和均为0;
  9. *(2)假设G是不连通的,则它的Kirchhoff矩阵C的任一个主子式的行列式均为0;
  10. *(3)假设G是一颗树,那么它的Kirchhoff矩阵C的任一个n-1阶主子式的行列式均为1;
  11. *

ACBANG_Magle的题解:

解题思路:

假设本题的要求只不过求这个图的生成树的个数。那么能够使用Kirchhoff矩阵求解:

可是该题中还存在一个问题,就是要求树上存在一个环,那么就须要缩点来实现了。将符合要求的环缩成一个点,最后的结果就是Σ(circle[i] * |C[G]|)。

先在仅剩下求环问题了。因为会缩点,因此,对相同的点的环。我们并不关心其环的形状,我们关心的不过环的数量,因此能够将点进行状压(点的个数唯独16个)。有例如以下定义:

dp[i][j] 代表 i 中状态下呈现链状的最后节点为j的种类

dp[i][j] = Σ dp[k][p](实际中是对dp[k][p]向后进行转移的)

同一时候保证,i状态下。链的起点为i中编号最小的点。

通过sum[i]数组记录i状态下的方案数。

通过上述步骤就能够解决该题了。

Tips:

因为缩点所产生的反复边是须要保存的。

因为环存在方向性。因此,就算规定了起点,对于一条链也会有2种转移方法。因此,最后结果须要除2。

在本题中与要注意使用逆元实现最后的除2,不能直接去除


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (998244353)
#define eps (1e-3)
#define MAXN (16+10)
#define MAXM (16*16+10)
typedef __int64 ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int n,m; ll r2; struct M
{
int n,m;
ll a[MAXN][MAXN];
M(int _n=0){n=m=_n;MEM(a);}
M(int _n,int _m){n=_n,m=_m;MEM(a);}
void mem (int _n=0){n=m=_n;MEM(a);}
void mem (int _n,int _m){n=_n,m=_m;MEM(a);} friend M operator*(M a,M b)
{
M c;
For(k,a.m)
For(i,a.n)
For(j,b.m)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%F;
return c;
}
void make_I(int _n)
{
n=m=_n; MEM(a)
For(i,n) a[i][i]=1;
}
// 求行列式
long double mat[MAXN][MAXN],tmp[MAXN];
long double det()
{
For(i,n) For(j,m) mat[i][j]=a[i][j];
For(i,n)
{
int pos=i;
while (fabs(mat[pos][i])<eps&&pos<n) ++pos;
if (fabs(mat[pos][i])<eps) continue;
if (pos^i)
{
copy(mat[pos]+1,mat[pos]+1+m+1,tmp+1);
copy(mat[i]+1,mat[i]+1+m+1,mat[pos]+1);
copy(tmp+1,tmp+1+m+1,mat[i]+1);
}
For(j,n)
if (i^j)
{
long double p = mat[j][i]/mat[i][i];
For(k,m) mat[j][k]-=mat[i][k]*p;
}
}
long double ans=1;
For(i,n) ans*=mat[i][i];
return ans;
}
}A,D,C; ll dp[(1<<16)+100][MAXN],sum[(1<<16)+100];
const ll p2[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
int pos_1(ll x){ll cnt=1; while ((x&1)^1) cnt++,x>>=1; return cnt; }
int all_1(ll x){ll cnt=0; while (x) cnt+=x&1,x>>=1; return cnt;}
void solve(int n)
{
MEM(dp) MEM(sum)
For(i,p2[n]-1)
{
ll cnt=all_1(i),pos=pos_1(i); if (cnt==1) { dp[i][pos]=1; } For(j,n) {
if (i&p2[j-1])
{
if (cnt>=3&&A.a[j][pos]) upd (sum[i], dp[i][j]);
Fork(l,pos+1,n)
if ( (p2[l-1]&i)==0 && A.a[j][l] )
upd(dp[i+p2[l-1]][l], dp[i][j] );
} }
} } M a;
int t[MAXN];
void work()
{
ll ans=0;
For(i,p2[n]-1)
{
if (sum[i])
{
ll cnt=all_1(i);
ll p=0;
For(j,n) if (i&p2[j-1]) t[j]=n-cnt+1; else t[j]=++p;
a.mem(n-cnt); For(j,n)
For(l,n)
if (t[j]!=t[l]&&A.a[j][l])
{
a.a[t[j]][t[j]]++;
a.a[t[j]][t[l]]--;
}
ll t2=(ll)(fabs(a.det())+eps)%F;
upd(ans,t2*sum[i]); }
} ans=mul(ans,r2);
cout<<ans<<endl;
} int u[MAXM],v[MAXM]; __int64 pow2(ll x,ll b)
{
if (b==0) return 1;
if (b==1) return x%F;
ll p=pow2(x,b/2);
p=p*p%F;
if (b&1) p=p*x%F;
return p;
} int main()
{
// freopen("E.in","r",stdin); r2=pow2(2,F-2); while (cin>>n>>m) {
A.mem(n),D.mem(n),C.mem(n);
For(i,m)
{
scanf("%d%d",&u[i],&v[i]);
D.a[u[i]][u[i]]++;
D.a[v[i]][v[i]]++;
A.a[u[i]][v[i]]++;
A.a[v[i]][u[i]]++;
}
solve(n);
work();
} return 0;
}

HDU 5304(Eastest Magical Day Seep Group&#39;s Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]的更多相关文章

  1. hdu5304 Eastest Magical Day Seep Group&#39;s Summer 状压dp+生成树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举全部的 ...

  2. 2017多校第9场 HDU 6162 Ch’s gift 树剖加主席树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6162 题意:给出一棵树的链接方法,每个点都有一个数字,询问U->V节点经过所有路径中l < ...

  3. [生产环境数据恢复]innobackupex: fatal error: OR no &#39;datadir&#39; option in group &#39;mysqld&#39; in MySQL options

    1 运行恢复命令  [xxx@xxx-c001db1 tmp]$ time /usr/bin/innobackupex --rsync --user="user" --passwo ...

  4. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

  5. HDU ACM 1025 Constructing Roads In JGShining&#39;s Kingdom-&gt;二分求解LIS+O(NlogN)

    #include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; ...

  6. hdu 1829 &amp;poj 2492 A Bug&#39;s Life(推断二分图、带权并查集)

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  7. HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点 ...

  8. Mysql Having的用法:对group by之后的分组加限制条件(复制)

    在使用聚合函数之前,我们可以通过where对查询加限制条件,那么如果在group by之后我们要对分组里面的数据再加限制条件怎么办呢?答案是having. HAVING子句可以让我们筛选成组后的各组数 ...

  9. HDU 2102 A计划(两层地图加时间限制加传送门的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

随机推荐

  1. 如何安装mongodb.msi

    到MongoDB官网下载MongoDB软件:mongodb-win32-x86_64-2008plus-ssl-3.0.2-signed.msi, 放在想要安装的地方: 如:d:\MongoDB\ 2 ...

  2. 设计模式之单例模式 Singleton实现

    饿汉式 饿汉式单例模式,static变量会在类装载时初始化,此时也不会涉及多个线程对象访问该对象的问题.虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题, 因此可以省略synchronized关 ...

  3. Python socket套字节

    套接字socket标准:位于:应用层--(socket抽象层)--传输层 之间 #Servre import socket phone=socket.socket(socket.AF_INET,soc ...

  4. zabbix2.4升级到2.5 --考虑升级到zabbix3.0

    现在zabbix服务器,zabbix服务日志频繁出现MySQL server  has gone away,经搜索,此问题在zabbix2.5之前是zabbix的一个bug,zabbix2.5后已经修 ...

  5. hiho[Offer收割]编程练习赛30

    题目1 : 提取用户名 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在现在的各种互联网应用中,在一段文字中使用'@'字符来提起一名用户是流行的做法. 例如: &quo ...

  6. c/c++内存泄露的检测方法

    此文内容摘自 https://zhuanlan.zhihu.com/p/22664202 作为   从零开始的 JSON 库教程(三):解析字符串解答篇  的笔记 1A. Windows 下的内存泄漏 ...

  7. 模拟select框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)

    Problem D: (ds:树)合并果子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 80  Solved: 4 [Submit][Status][ ...

  9. NOJ——1659求值(log10取对数+floor取整数部分+可有可无的快速幂)

    [1659] 求值 时间限制: 1000 ms 内存限制: 65535 K 问题描述 给你三个数a,b,c,求a的b次的前c位数(不够c位输出全部即可) 输入 输入数据有多组,每组占一行,有三个整数, ...

  10. [bzoj1095][ZJOI2007]Hide 捉迷藏 点分树,动态点分治

    [bzoj1095][ZJOI2007]Hide 捉迷藏 2015年4月20日7,8876 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiaji ...