博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SHOI2016]黑暗前的幻想乡
阅读量:5078 次
发布时间:2019-06-12

本文共 2417 字,大约阅读时间需要 8 分钟。

Description

四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖
怪涌入了幻想乡,扰乱了幻想乡昔日的秩序。但是幻想乡的建制派妖怪(人类)
博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡
目前面临的种种大问题却给不出合适的解决方案。
风间幽香是幻想乡里少有的意识到了问题的严重性的大妖怪。她这次勇敢的
站了出来参加幻想乡大选。提出包括在幻想乡边境建墙(并让人类出钱),大力
开展基础设施建设挽回失业率等一系列方案,成为了大选年出人意料的黑马并顺
利的当上了幻想乡的大统领。
幽香上台以后,第一项措施就是要修建幻想乡的公路。幻想乡有 N 个城市,
之间原来没有任何路。幽香向选民承诺要减税,所以她打算只修 N- 1 条路将
这些城市连接起来。但是幻想乡有正好 N- 1 个建筑公司,每个建筑公司都想
在修路的过程中获得一些好处。
虽然这些建筑公司在选举前没有给幽香钱,幽香还是打算和他们搞好关系,
因为她还指望他们帮她建墙。所以她打算让每个建筑公司都负责一条路来修。
每个建筑公司都告诉了幽香自己有能力负责修建的路是哪些城市之间的。所
以幽香打算选择 N-1 条能够连接幻想乡所有城市的边,然后每条边都交给一
个能够负责该边的建筑公司修建,并且每个建筑公司都恰好修一条边。
幽香现在想要知道一共有多少种可能的方案呢?两个方案不同当且仅当它
们要么修的边的集合不同,要么边的分配方式不同。

Input

第一行包含一个正整数 N(N<=17), 表示城市个数。
接下来 N-1 行,其中第 i行表示第 i个建筑公司可以修建的路的列表:
以一个非负数mi 开头,表示其可以修建 mi 条路,接下来有mi 对数,
每对数表示一条边的两个端点。其中不会出现重复的边,也不会出现自环。

Output

仅一行一个整数,表示所有可能的方案数对 10^9 + 7 取模的结果。

Sample Input

4
2 3 2 4 2
5 2 1 3 1 3 2 4 1 4 3
4 2 1 3 2 4 1 4 2

Sample Output

17
这题直接Matrix-Tree肯定是不行的,因为我们要把n-1条边分给n-1个不同公司
直接计算出来的方案包括有些公司未参与的修建方案
令f[i]为禁止i个公司参与的方案数,利用容斥原理
$ans=f[0]-f[1]+f[2]-f[3]....(-1)^{n}*f[n]$
可以枚举二进制状态,参加为1,禁止参加为0
然后建出相应的基尔霍夫矩阵,根据Matrix-Tree定理算出行列式的值
根据0的数量决定加减
1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 struct ZYYS 8 { 9 int u,v;10 }edge[18][501];11 int n,a[18][18],Mod=1e9+7,len[18],ans;12 int guass()13 {
int i,j,k,s;14 n--;15 for (i=1;i<=n;i++)16 {17 for (j=1;j<=n;j++)18 {19 a[i][j]=(a[i][j]+Mod);20 if (a[i][j]>=Mod) a[i][j]-=Mod;21 }22 }23 s=1;24 for (i=1;i<=n;i++)25 {26 for (j=i+1;j<=n;j++)27 while (a[j][i])28 {29 int t=a[i][i]/a[j][i];30 for (k=i;k<=n;k++)31 {32 a[i][k]=(a[i][k]-1ll*t*a[j][k]%Mod+Mod);33 if (a[i][k]>=Mod) a[i][k]-=Mod;34 swap(a[i][k],a[j][k]);35 }36 s*=-1;37 }38 s=1ll*s*a[i][i]%Mod;39 if (!s)40 {41 n++;42 return 0;43 }44 }45 n++;46 return (s+Mod)%Mod;47 }48 int main()49 {
int i,j,k,as,cnt;50 cin>>n;51 for (i=1;i<=n-1;i++)52 {53 scanf("%d",&len[i]);54 for (j=1;j<=len[i];j++)55 {56 scanf("%d%d",&edge[i][j].u,&edge[i][j].v);57 }58 }59 for (i=0;i<=(1<
=Mod) ans-=Mod; 79 }80 cout<<(ans+Mod)%Mod;81 }

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/8428561.html

你可能感兴趣的文章
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
OO设计的接口分隔原则
查看>>
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>
jQuery.form.js使用
查看>>