hdu 5304 基尔霍夫矩阵

拉普拉斯矩阵/映射/聚类 拉普拉斯矩阵是个非常巧妙的东西,它是描述图的一种矩阵,在降维,分类,聚类等机器学习的领域有很广泛的应用。 阅读详情

关于基尔霍夫矩阵:

*算法引入:
*给定一个无向图G,求它生成树的个数t(G);
*
*算法思想:
*(1)G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数;
*(2)G的邻接矩阵A[G]是一个n*n的矩阵,并且满足:如果vi,vj之间有边直接相连,则aij=1,否则为0;
*定义图G的Kirchhoff矩阵C[G]为C[G]=D[G]-A[G];
*Matrix-Tree定理:G的所有不同的生成树的个数等于其Kirchhoff矩阵C[G]任何一个n-1阶主子式的行列式的绝对值;
*所谓n-1阶主子式,就是对于r(1≤r≤n),将C[G]的第r行,第r列同时去掉后得到的新矩阵,用Cr[G]表示;


思路:此题要求删掉m-n 条边得到联通图的方案数,相当于m条边选n条,得到联通图的方案数。

如果是选n-1条,那就是得到一个生成树。n条相当于在树上再加一条边,也就是有一个环的树。

那么就要枚举环,把环缩点,然后用基尔霍夫矩阵计算。

/*************************************************************************
 > File Name: hdu5304.cpp
 > Author: TechMonster
 > Mail: 928221136@qq.com
 > Created Time: 五  7/ 8 15:07:09 2016
 ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
#define ls (o<<1)
#define rs (o<<1|1)
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x, y) memcpy(x, y, sizeof(x))
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 50010;
const LL M = 998244353ll;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) {a += b; if(a > M) a%=M;}

int n,m;
int mp[16][16],top;
LL sum[70000],dp[16][70000];
LL Pow(LL x, LL n)
{
	LL ret = 1;
	while(n)
	{
		if(n&1) ret=ret*x%M;
		n>>=1;
		x = x*x%M;
	}
	return ret;
}
LL Gauss(LL C[][20],int n)//计算n阶行列式的绝对值 % mod
{
	LL ans=1ll;
	int flag=1;//行列交换的次数
	int i,j,k;
	for(i=0;i<n;i++)
	{
		if(C[i][i]==0)
		{
			for(j=i+1;j<n;j++)
				if(C[j][i])break;
			if(j==n)return 0;//某列的值全是0的ans=0;
			flag=!flag;
			for(int k=i;k<n;k++)
				swap(C[i][k],C[j][k]);//i和j行交换
		}
		ans=ans*C[i][i]%M;//对角线相乘
		LL x = Pow(C[i][i],M-2);//x为逆元
  
		for(k=i+1;k<n;k++)
			C[i][k]=C[i][k]*x%M;
  
  
		for(int j=i+1;j<n;j++)
			for(int k=i+1;k<n;k++)
			{
				C[j][k]=(C[j][k]-C[j][i]*C[i][k])%M;
				if(j==k)
					C[j][k]=(C[j][k]+M)%M;
			}
		for(k=i+1;k<n;k++)
			C[i][k]=C[i][k]*C[i][i]%M;
  
	}
	
	ans=(ans%M+M)%M;
	if(flag) return ans;
	else  return M-ans;
}
int getst(int x) {for(int i = 0; i < n; ++i) if(x & 1<<i) return i;return -1;}
int getnum(int x) {int ret = 0;while(x) x-=x&-x,ret++; return ret;}
void getCircle()
{
	MS(dp,0);MS(sum,0);
	top = 1<<n;
	for(int sta = 1; sta < top; ++sta)
	{
		int s = getst(sta), num = getnum(sta);
		if(num == 1) dp[s][sta] = 1;
		for(int e = s; e < n; ++e)
		{
			if(!dp[e][sta]) continue;
			for(int e2 = s+1; e2 < n; e2++)
			{
				if(sta & 1<<e2 || !mp[e][e2]) continue;
				gadd(dp[e2][sta | 1<<e2],dp[e][sta]);
			}
			if(num >= 3 && mp[e][s])
				gadd(sum[sta],dp[e][sta]);
		}
	}
}
int id[16];
LL C[20][20];
void solve()
{
	int u,v;
	MS(mp,0);
	for(int i = 0; i < m; ++i)
	{
		scanf("%d%d",&u,&v);
		u--,v--;
		mp[u][v] = mp[v][u] = 1;
	}
	getCircle();

	int cnt;
	LL ans = 0;
	for(int sta = 0; sta < top; ++sta)
	{
		MS(C,0);
		if(!sum[sta]) continue;
		cnt = 1;
		for(int i = 0; i < n; ++i)
			if(sta & 1<<i) id[i] = 0;
			else id[i] = cnt++;
		for(int i = 0; i < n; ++i)
			for(int j = 0; j < n; ++j)
			{
				if(id[i] != id[j] && mp[i][j])
				{
					C[id[i]][id[i]]++;
					C[id[i]][id[j]]--;
				}
			}
		gadd(ans,Gauss(C,cnt-1)*sum[sta]%M);
	}
	printf("%lld\n",ans*Pow(2,M-2)%M);
}
int main()
{
	while(~scanf("%d%d",&n,&m))
		solve();
	return 0;
}


图论(遍历生成树) 介绍了图论中最基本的几个问题: 一、宽度优先遍历 二、深度优先遍历 三、最短路问题 四、最小生成树问题 立即下载

相关推荐

实施文档

流程管理 2008-04-23 09:44:00 874 收藏 3 分类专栏: 企业管理杂谈 文章标签: 文档 文档管理 项目管理 工作 配置管理 工具 项目实施文档是用来记录、描述、展示实施过程中一系列信息的处理过程,通过书面或图示的形式对项目活动过程或结果进行描述、定义、规定及报告。例如分阶段实施计划文档,标准业务流程文档,标准编码及数据文档,标准参数设置文档,功能操作指南文档。这些文档将会伴随着ERP实施的各个阶段逐渐充实、完善,也同时记载了整个实施的过程和成果。 作为实施顾问人员,在实施过程

qq_52337172的博客 1063

基尔霍夫矩阵

1)无向图 𝐺:给定 𝑛 个点,𝑚 条边的无向图,设点集为 𝑉,边集为 𝐸,则其记为 𝐺(𝑉,𝐸)2)度数矩阵 𝐷[𝐺]:当 𝑖≠𝑗 时,𝐷[𝑖][𝑗]=0,当 𝑖=𝑗 时,𝐷[𝑖][𝑗]=点𝑣的度数3)邻接矩阵 𝐴[𝐺]:当 𝑣𝑖、𝑣𝑗 有边连接时,𝐴[𝑖][𝑗]=1,当 𝑣𝑖、𝑣𝑗 无边连接时,𝐴[𝑖][𝑗]=04)基尔霍夫矩阵(Kirchhoff) 𝐾[𝐺]:也称拉普拉斯算子,其定义为 𝐾[𝐺]=𝐷[𝐺]−𝐴[𝐺],即:𝐾[𝑖][𝑗]=𝐷[𝑖][𝑗]−𝐴[𝑖][𝑗]

xinnnnnyu的博客 939

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7116

基尔霍夫(kirchhoff)矩阵树定理

引入问题   给n个点m条边的图,求该图的最小生成树个数。 基尔霍夫矩阵   定义:如果图DDD有总共NNN个点,那么图DDD的基尔霍夫矩阵GGG可以表示为:   Gij={degree(i)i=j−cnt(i,j)i≠jG_{ij}=\left\{ \begin{array}{rcl} & degree(i) & &{i=j}\\ &−cnt(i,j) & &{i \neq j}\\ \end{array}\right.Gij​={​degree(i)

TK_wang_的博客 4738

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

念兮为美 1万+

STM32Cube高效开发教程<高级篇><FreeRTOS>(一)-----FreeRTOS基础

一、 FreeRTOS概述声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。写在前面:今天就算正式开始高级篇的博客编写了,我本人也是第一次学习FreeRTOS,所以整体的进度会比较慢,博客更新可能不太会及时,希望大家原谅。一、 FreeRTOS概述。

我的博客 1848

图论 —— 生成树 —— 生成树计数 —— 基尔霍夫矩阵

【概述】 Matrix-Tree 定理又称基尔霍夫矩阵树定理,其用于解决:给定 n 个点 m 条边的无向图,求图的生成树个数的问题。 其利用线性代数中矩阵的行列式来进行求解,关于矩阵的行列式:点击这里 【基尔霍夫矩阵】 1.基本定义 1)无向图 G:给定 n 个点,m 条边的无向图,设点集为 V,边集为 E,则其记为 G(V,E) 2)度数矩阵 D[G]:当 i≠j时,D[i][j]...

Alex_McAvoy的博客 3814

【GameFramework框架】二、GameFramework框架介绍

Game Framework框架是由E大(Ellan Jiang)开源的一款基于Unity的通用游戏框架。Game Framework框架提供了游戏开发中常用的框架基础模块,将基础模型进行了封装,在资源管理和资源更新方面比较完善,可以大大加大开发进程,加快开发速度,并且还在在此此处上保证产品质量。实在是代码开发、框架学习、编程进阶、居家旅行哦不对,是提升自己的最佳实践。Game Framework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5851

基尔霍夫定理

重发下这篇原发于 2013-12-26 的网易博客 感觉这是我当年我写过的最有趣(?)的博客之一? 然而这东西吧,如果你上了姚班,教计算机应用数学的姚先生或者教算法设计课的李老师会分分钟给你证了【手动捂脸】 但高中的时候我为了搞懂这个证明花了好久,搞懂之后当然也被自己感动了很久。。 当时公式都是纯文本+等宽字体排版的,转到优快云看着有点难受。。不过愿诸位读者看完此文也能体会到搞懂一个大证明的快乐。。 另外欢迎大家报考姚班 英文叫Kirchhoff’s Matrix-Tree Theorem。 基尔霍夫的

VFleaKing的博客 2701

R语言广义加型模型(GAM)的运用例子及实现教程

一旦拟合了广义加型模型,我们可以查看模型摘要和诊断,以评估模型的质量和拟合情况。# 查看模型摘要响应变量:mpg(汽车的燃油效率)拟合函数:mpg ~ s(hp) + s(wt)

Mrrunsen的博客 3447

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

【hdu5304】生成树计数—基尔霍夫矩阵 DP

给一个无向图,求有多少个子图是基环树。 枚举环后缩点,再求生成树计数。 2^n枚举环上的点,dp预处理出每个集合的环的个数(默认以编号最小的点为起点),用f[i][s]表示环尾为i,点集为s。 #include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++)

Owen_hzt的专栏 1614

《八》:玩家位置同步(玩家防碰撞)

在VR大空间体验中,由于玩家佩戴头显设备无法直接观察彼此位置,容易发生碰撞。因此,需要将玩家的实时位置信息绘制在虚拟空间中,实现位置可视化。通过获取头显的位置和旋转角度等数据,可以推算出玩家的移动状态和位置。使用可序列化的玩家结构体,通过UDP将玩家数据发送到服务器,服务器接收并反序列化数据后,同步所有玩家的最新信息至各客户端。客户端根据接收到的数据渲染虚拟人物模型,实现动态位置更新。这一过程涉及数据序列化、反序列化、网络通信和实时渲染等技术,确保玩家在虚拟空间中的位置同步和可视化。

unitygroup的博客 413

hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图。(即多一条边的树) 先n^3 * 2^n 枚举所有的环,状压dp就行。dp[i][j]表示以i为终点,走了j状态集合的方案数。要枚举起点,每次走比起点大的点。所以要n^3 2^n枚举。 把环压缩成点,构造基尔霍夫矩阵,每种状态下n

alpc_wt的专栏 1444

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[hdu5304]Eastest Magical Day Seep Group‘s Summer

Eastest Magical Day Seep Group's Summer 题解 看到题面时应该很容易想到矩阵树定理,但是由于是一个条边的连通图,并不能直接用矩阵树来处理。 很容易发现,任意一个个点条边的连通图,一定是一棵基环树,于是我们可以考虑缩点。 考虑状压,表示一根起点为的链状态为的图的构成方案数,可以通过背包来进行更新。 之后枚举每个,再计算出每个状态为的环的构成方案数,将所有在中的点缩点后再将该图的基尔霍夫矩阵建出来,计算出它的行列式值,加上它的贡献即可。由于每个环有两个方向,还需要

StaroForgin的博客 321

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图。(即多一条边的树) 先n^3 * 2^n 枚举全部的环。状压dp即可。dp[i][j]表示以i为终点,走了j状态集合的方案数。要枚举起点,每次走比起点大的点。所以要n^3 2^n枚举。 把环压缩成点。构造基尔霍夫矩阵。每种...

weixin_33877885的博客 199

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

矩阵树定理

矩阵树定理 用于求解图上的生成树个数。生成树个数等于基尔霍夫矩阵任何一个N−1N-1N−1阶主子式的行列式的绝对值。 基尔霍夫矩阵构造方法 AAA为邻接矩阵,DDD为度数矩阵,基尔霍夫(Kirchhoff)矩阵为K=D−AK=D-AK=D−A。 即a[i][i]a[i][i]a[i][i]为点iii的度数,a[i][j]a[i][j]a[i][j]为iii,jjj之间边数的相反数。 例子: 行列...

wennitao的博客 2207

拉普拉斯矩阵

拉普拉斯矩阵(Laplacian matrix),也称为基尔霍夫矩阵(Kirchhoff matrix),是图论中的一个概念,常用于描述图的结构特性。拉普拉斯矩阵在图论、网络分析、机器学习等领域有着广泛的应用。是度矩阵(对角矩阵,对角线上的元素是顶点的度数),之间存在一条边,则对应的非对角线元素。如果两个顶点之间没有边,则。相连的边的数量,即顶点。是边集合,拉普拉斯矩阵。,其对应的对角线元素。

qq_51082388的博客 1820

基尔霍夫矩阵&矩阵树定理学习笔记

背景: 好多东西没学。 勇士被快船惊天大逆转!!! 快船NBNBNB。 正题: Part1Part1Part1: 对于一个n∗nn*nn∗n的矩阵。 设ppp枚举列的全排列,nixudui(p)nixudui(p)nixudui(p)表示排列ppp的逆序对的个数。 则其行列式为∑p(−1)nixudui(p)∏i=1ni∗pi\sum_p(-1)^{nixudui(p)}\prod_{i=1}...

zsyz_ZZY的博客 1822

生成树个数(基尔霍夫矩阵)

Problem 2. tcount Input file: tcount.in Output file: tcount.out Time limit: 1 second Mr.H发现了一个无向连通图,它觉得,如果选出一些边来,使得这个图变为一棵树,那么这个边集就非常棒。 现在,Mr. H 想让你帮忙求出有多少个非常棒的边集? Input 第1行,包含2个整数:n m,表示有n个点m条边

w4149 6538

基尔霍夫矩阵计算欧拉回路

Matrix-Tree定理(Kirchhoff矩阵-树定理) *算法思想: *(1)G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数; *(2)G的邻接矩阵A[G]是一个n*n的矩阵,并且满足:如果vi,vj之间有边直接相连,则aij=1,否则为0; *定义图G的Kirchhoff矩阵C[G]为C[G]=D[G]-A[G];

RCY_ZHU的博客 808

BZOJ 1002: [FJOI2007]轮状病毒 递推/基尔霍夫矩阵树定理

f[n]=3*f[n-1]-f[n-2]+2 1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2959  Solved: 1644 [Submit][Status][Discuss] Description 给定n(N Input 第一行有1个正整数n。 Outp

码代码的猿猿 1687

最大团 极大团 Bron–Kerbosch算法 poj 2989

昨日老刘开了最大团专题后,起初以为挺简单,后来发现有点麻烦。能用的资料又很少。分享一下学习的东西 以poj 2989为例,题意是求 不同极大团的数量 要用Bron–Kerbosch算法 首先是最朴素的伪代码,没有任何剪枝(来自维基百科)https://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm Bro

QZQ 9355
上一篇: 插头dp入门 hdu 4804 + 5286
下一篇: hdu 4997 状压dp
QZQmmmm
博客等级 码龄11年 77粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值