题目:https://www.luogu.org/problemnew/show/P4336

当作考试题了,然而没想出来,呵呵。

其实不是二分图完美匹配方案数,而是矩阵树定理+容斥...

就是先放上所有的边,求生成树个数,但其中可能有的公司的边没有选上,所以减去至少一个公司没选上的,加上两个...

高斯消元里面可以直接除而不用辗转相除,因为取模可以乘逆元,反倒是辗转相除里不能直接用除法,会减不到0。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
using namespace std;
typedef long long ll;
int const xn=,xm=,mod=1e9+;
int n,m[xn],id[xn][xn],deg[xn][xn],sid[xn][xn],ans,cnt;
ll a[xn][xn];
vector<int>vc[xn];
struct N{int u,v;}ed[xm];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
ll pw(ll a,int b)
{
ll ret=;
for(;b;b>>=,a=(a*a)%mod)if(b&)ret=(ret*a)%mod;
return ret;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
int gauss()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)a[i][j]=upt(deg[i][j]-sid[i][j]);
int fl=;
for(int i=;i<n;i++)
{
int t=i;
for(int j=i+;j<n;j++)
if(a[j][i]>a[t][i])t=j;
if(t!=i)
{
fl=-fl;
for(int j=;j<n;j++)swap(a[i][j],a[t][j]);
}
for(int j=i+;j<n;j++)
{
int tmp=(ll)a[j][i]*pw(a[i][i],mod-)%mod;//a[j][i]/a[i][i]
for(int k=i;k<n;k++)
a[j][k]=upt(a[j][k]-(ll)tmp*a[i][k]%mod);
}
}
ll ret=;
for(int i=;i<n;i++)ret=(ll)ret*a[i][i]%mod;
return ret*fl;
}
void dfs(int nw,int s)
{
if(nw==n)
{
int sum=gauss();
if((s&)==((n-)&))ans+=sum; else ans-=sum;
ans=upt(ans);
return;
}
dfs(nw+,s); int siz=vc[nw].size();
for(int i=;i<siz;i++)
{
int u=ed[vc[nw][i]].u,v=ed[vc[nw][i]].v;
deg[u][u]++; deg[v][v]++;
sid[u][v]++; sid[v][u]++;
}
dfs(nw+,s+);
for(int i=;i<siz;i++)
{
int u=ed[vc[nw][i]].u,v=ed[vc[nw][i]].v;
deg[u][u]--; deg[v][v]--;
sid[u][v]--; sid[v][u]--;
}
}
int main()
{
n=rd();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
ed[++cnt].u=i,ed[cnt].v=j,id[i][j]=id[j][i]=cnt;
for(int i=;i<n;i++)
{
m[i]=rd();
for(int j=,x,y;j<=m[i];j++)x=rd(),y=rd(),vc[i].pb(id[x][y]);
}
dfs(,);
printf("%d\n",ans);
return ;
}

洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理的更多相关文章

  1. 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理

    [BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...

  2. 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 324  Solved: 187 Description ...

  3. bzoj 4596: [Shoi2016]黑暗前的幻想乡【容斥原理+矩阵树定理】

    真是简单粗暴 把矩阵树定理的运算当成黑箱好了反正我不会 这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了 然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数-不选工程队 ...

  4. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

  5. BZOJ 4596: [Shoi2016]黑暗前的幻想乡(容斥+Matrix_Tree)

    传送门 解题思路 看到计数想容斥--\(from\) \(shadowice1984\)大爷.首先求出原图的生成树个数比较容易,直接上矩阵树定理,但这样会多算一点东西,会把\(n-2\)个公司的多算进 ...

  6. P4336 [SHOI2016]黑暗前的幻想乡

    P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...

  7. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  8. bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 264[Submit][Sta ...

  9. 「SHOI2016」黑暗前的幻想乡 解题报告

    「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...

随机推荐

  1. HTML5之Canvas绘图(二) ——应用篇之七巧板

    1.canvas绘制七巧板-- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  2. Multicast注册中心

    1 2 3 4 提供方启动时广播自己的地址. 消费方启动时广播订阅请求. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者. 消费方收到提供方地址时, ...

  3. MySQL -- Ubuntu下的操作命令

    =======================安装======================参照MySQL官网的步骤:https://dev.mysql.com/doc/mysql-apt-repo ...

  4. oracle角色(role)概念

    一个角色是一组特权,它可以授权给用户或其它角色. 特权有:create table,select on boss ,create session,insert on boss,update on bo ...

  5. C语言补漏(1)--- char到int赋值的一个陷阱

    作为一个C的新手(虽然学的第一门语言就是C,可是用C实际开发项目却是最近的事情),对使用C过程中遇到的各类问题.疑惑.知识漏洞进行弥补无疑是非常有必要的,于是决定将每次遇到的知识漏洞写到博客上. 今天 ...

  6. 转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

    最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本 ...

  7. 兔子的晚会 2016Vijos省选集训 day1

    兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. ...

  8. Linuxt图形界面安装

    通常安装图形界面需要安装Xorg.桌面环境(Gnome.KDE.xfce等).字体等.你的Linux是什么版本?具体要看你的linux来决定用什么命令来安装. #yum grouplist 自己看看列 ...

  9. Spring自定义配置--ConfigurationProperties

    自定义配置的变量名: 在 *.properties 里面定义特定的变量 server.port=9000 amazon.associateId=habuma-20 建立Properties文件制定特定 ...

  10. 【linux】ubuntu16.04安装vncserver实现远程访问图形界面

    # 步骤 1 - 安装 X11VNC  sudo apt install x11vnc -y # 步骤 2 - 配置访问密码 sudo x11vnc -storepasswd /etc/x11vnc. ...