【BZOJ 3659】 3659: Which Dreamed It (Matrix-Tree&BEST theorem )

3659: Which Dreamed It

Time Limit: 20 Sec  Memory Limit: 1024 MB
Submit: 134  Solved: 41

Description

有n个房间,每个房间有若干把钥匙能够打开特定房间的门。

你会做这么件事情:

最初你在房间1。

每当你到达一个房间,你可以选择该房间的一把钥匙,前往该钥匙对

应的房间,并将该钥匙丢到垃圾桶中。

你希望:最终回到房间1,且垃圾桶中有所有的钥匙。

求方案数。两组方案不同,当且仅当使用钥匙的顺序不同。注意,每

把钥匙都是不同的。

Input

有多组数据。

对于每组数据第一行输入一个数n,表示房间数。

接下来n行依次描述每个房间:

首先一个数s,表示这个房间的钥匙数目,接下来s个数,分别描述每把

钥匙能够打开的房间的门。

输入以n-0结尾。

Output

对于每组数据,输出方案数,为了方便你的输出,请将答案对1000003取模。

Sample Input

1

0

2

1 1

1 2

0

Sample Output

1

0

HINT

在第一组样例中,没有钥匙,则方案数为1。

在第二组样例中,你不可能使用第二个房间的钥匙,所以方案数为0。

房间数小于等于100,钥匙数小于等于200000。

数据组数也不是特别多。

Source

【分析】

  这种题叫做结论题。

  %CA爷

  然后这里有两个结论 
  1.有向图以i为根的树形图的数目=基尔霍夫矩阵去掉第i行和第i列的主子式的行列式的值(即Matrix-Tree定理不仅适用于求无向图生成树数目,也适用于求有向图树形图数目) 
  2.以某个点为起点的欧拉回路数=该点为根的树形图数*(所有点出度-1)的乘积(本名BEST theorem) 
  关于BEST theorem可以提供一个wiki上的讲解:about BEST theorem

  最后还有乘上起点的出度?【怎么没说。。

【我觉得我Mod那里应该有问题,但是我没有被卡哦。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define LL long long
 8 const int Mod=1000003;
 9 #define Maxn 1000010
10
11 int a[110][110],m[110],fac[Maxn];
12
13 int qpow(int x,int b)
14 {
15     x%=Mod;
16     int ans=1;
17     while(b)
18     {
19         if(b&1) ans=1LL*ans*x%Mod;
20         x=1LL*x*x%Mod;
21         b>>=1;
22     }
23     return ans;
24 }
25
26 int gauss(int n)
27 {
28     if (n==0) return 1;
29     int ans=1;
30     for(int i=1;i<=n;i++)
31     {
32         int t=i;
33         for(int j=i+1;j<=n;j++) if(a[j][i]>a[t][i]) t=j;
34         if(a[t][i]==0) return 0;
35         if(t!=i)
36         {
37             ans=-ans;
38             for(int j=1;j<=n;j++) swap(a[t][j],a[i][j]);
39         }
40         int ny=qpow(a[i][i],Mod-2);
41         for(int j=i+1;j<=n;j++)
42         {
43             int nw=1LL*ny*a[j][i]%Mod;
44             for(int k=i;k<=n;k++) a[j][k]-=1LL*a[i][k]*nw%Mod,a[j][k]=(a[j][k]%Mod+Mod)%Mod;
45         }
46     }
47     for(int i=1;i<=n;i++) ans=1LL*ans*a[i][i]%Mod;
48     ans=(ans%Mod+Mod)%Mod;
49     return ans;
50 }
51
52 int main()
53 {
54     int n;
55     fac[0]=1;for(int i=1;i<=Mod;i++) fac[i]=1LL*fac[i-1]*i%Mod;
56     while(1)
57     {
58         scanf("%d",&n);
59         if(!n) break;
60         memset(a,0,sizeof(a));
61         for(int i=1;i<=n;i++)
62         {
63             scanf("%d",&m[i]);
64             for(int j=1;j<=m[i];j++)
65             {
66                 int x;
67                 scanf("%d",&x);
68                 if(i!=x) a[i][x]--,a[i][i]++;
69             }
70         }
71         if(n==1&&!m[1]) {printf("1\n");continue;}
72         int ans=1;
73         for(int i=1;i<=n;i++) ans=1LL*ans*fac[m[i]-1]%Mod;
74         ans=1LL*ans*m[1]%Mod;
75         ans=1LL*ans*gauss(n-1)%Mod;
76         printf("%d\n",ans);
77     }
78     return 0;
79 }

2017-04-16 20:11:07

时间: 2024-11-03 22:45:23

【BZOJ 3659】 3659: Which Dreamed It (Matrix-Tree&BEST theorem )的相关文章

【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)

题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇看作一个二维平面坐标系,而 Ayu 会不定时地记起可能在某个点 (xmy) 埋下了天使玩偶:或者 Ayu 会询问你,假如她在 (x,y) ,那么她离近的天使玩偶可能埋下的地方有多远. 因为 Ayu 只会沿着平行坐标轴的方向来行动,所以在这个问题里我们定义两个点之间的距离为dist(A,B)=|A

【BZOJ 1036】树的统计Count(树链剖分)

[BZOJ 1036]树的统计Count(树链剖分) 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 12991  Solved: 5233 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权

【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11294   Accepted: 3091 Description Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I still remembe

【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 739 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N

【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)

链接:click here~~ [题意] 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大. [解题思路] 又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值. 代码: #include <stdio.h> #include <string.h> #include <

【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of

【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] Description RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色 .每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子 ),黑变白,白变黑.RHL希望把所有格子都变成白色的.不幸

【BZOJ 4305】 4305: 数列的GCD (数论)

4305: 数列的GCD Description 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], ..., b[N],满足: (1)1<=b[i]<=M(1<=i<=N): (2)gcd(b[1], b[2], ..., b[N])=d: (3)恰好有K个位置i使得a[i]<>b[i](1<=i<=N) 注:gcd(x1,x2,

【BZOJ 1060】 1060: [ZJOI2007]时态同步 (树形DP)

1060: [ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅 存在一条通路(通路指连接两个元件的导线序列).在电路板上存在一个特殊的元件称为"激发器".当激发器工 作后,产生一个激励电流,通过导线传向每一个它所连接的节点.而中间节点接收到激励电流后,得到信息,并将 该激励电流传向

【BZOJ 1528】 1528: [POI2005]sam-Toy Cars (贪心+堆)

1528: [POI2005]sam-Toy Cars Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架