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. Xshell设置登录会话

    新建会话 点击用户登录验证输入账号密码 如果是公钥登录,选择pubulic key登录

  2. [译]__main__ 顶级脚本环境

    'main'是其中顶级代码执行的范围的名称.一个模块的__name__可以从标准输入,脚本,或从一个交互式命令行中等方式被设置成等于'main'. 一个模块可以发现它是否是通过检查自身在主运行范围__ ...

  3. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明

    文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...

  4. 将模型储存到本地-FastCoder

    // // ViewController.m // 模型转data储存 // // Created by 谭启宏 on 16/3/4. // Copyright © 2016年 tqh. All ri ...

  5. Welcome-to-Swift-19类型嵌套(Nested Types)

    枚举类型常被用于实现特定类或结构体的功能.也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型.类和结构体中定义支持嵌套的类型 ...

  6. kb-01-d<poj3279>--深搜变种,二进制优化;

    poj--3279 题意: 给n*m的矩阵,0 1组成,每次翻转一个格子可以将上下左右的五个节点翻转,求,把所有的格子翻转成0:输出每个个字的翻转次数:最少字数: 做法: 从上到下,第一行翻转的情况确 ...

  7. iOS-BMK标注&覆盖物

    在iOS开发中,地图算是一个比较重要的模块.我们常用的地图有高德地图,百度地图,谷歌地图,对于中国而言,苹果公司已经不再使用谷歌地图,官方使用的是高德地图.下面将讲述一下百度地图开发过程中的一些小的知 ...

  8. eclipse testng插件安装

    1.安装Testng 在Eclipse中,点击Help→Install new software→点击Add,在location中输入http://beust.com/eclipse ,选择TestN ...

  9. samba安装和配置

    windows和windows系统之间要实现文件共享是通过网络邻居实现linux和windows之间通过什么来实现文件共享呢?一.通过文件挂载(首先要制作ISO镜像文件,然后在用挂载命令)二.通过sa ...

  10. ng-include

    ng-include可以作为标签或者属性来使用,作用是引入公用文件. <div ng-include="'header.html'"></div> 注意里面 ...