无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

基尔霍夫矩阵

https://blog.csdn.net/w4149/article/details/77387045

https://blog.csdn.net/qq_29963431/article/details/51236064

题目链接  https://vjudge.net/problem/SPOJ-HIGH

AC代码

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define fi first
 5 #define se second
 6 #define all(a) (a).begin(), (a).end()
 7 #define fillchar(a, x) memset(a, x, sizeof(a))
 8 #define huan printf("\n");
 9 #define debug(a,b) cout<<a<<" "<<b<<" ";
10 using namespace std;
11 typedef long long ll;
12 const int maxn=1e3+100,maxm=100,inf=0x3f3f3f3f;
13 const ll mod=998244353;
14 ll a[maxn][maxn],du[maxn];
15 ll det(int n)
16 {
17     ll ans = 1;
18     for (int i = 2; i <= n; i++)
19     {
20         for (int j = i + 1; j <= n; j++)
21         {
22             while (a[j][i] != 0)
23             {
24                 ll u = a[i][i] / a[j][i];
25                 for (int k = i; k <= n; k++)
26                 {
27                     ll t = (a[i][k] - (ll)a[j][k] * u);// % mod + mod) % mod;
28                     a[i][k] = a[j][k];
29                     a[j][k] = t;
30                 }
31                 ans = -ans;
32             }
33         }
34         ans = ans * a[i][i] ;//% mod;
35     }
36     if (ans < 0)
37     {
38         ans=-ans;
39         //ans += mod;
40     }
41     return ans;
42 }
43 int main()
44 {
45     int t,n,m;
46     scanf("%d",&t);
47     while(t--)
48     {
49         fillchar(a,0);
50         fillchar(du,0);
51         scanf("%d%d",&n,&m);
52         for(int i=0;i<m;i++)
53         {
54             int u,v;
55             scanf("%d%d",&u,&v);
56             du[u]++,du[v]++;
57             a[v][u]=-1,a[u][v]=-1;
58         }
59         for(int i=1;i<=n;i++)
60             a[i][i]=du[i];
61         printf("%lld\n",det(n));
62     }
63 }

 行列式求值模板

int a[maxn][maxn];
ll det(int n)
{
    ll ans = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            while (a[j][i] != 0)
            {
                ll u = a[i][i] / a[j][i];
                for (int k = i; k <= n; k++)
                {
                    int t = (a[i][k] - (ll)a[j][k] * u % mod + mod) % mod;
                    a[i][k] = a[j][k];
                    a[j][k] = t;
                }
                ans = -ans;
            }
        }
        ans = ans * a[i][i] % mod;
    }
    if (ans < 0)
    {
        ans += mod;
    }
    return ans;
}

原文地址:https://www.cnblogs.com/stranger-/p/9508249.html

时间: 2024-08-09 15:57:09

无向图生成树计数 基尔霍夫矩阵 SPOJ Highways的相关文章

生成树的计数(基尔霍夫矩阵):UVAoj 10766 Organising the Organisation SPOJ HIGH - Highways

HIGH - Highways In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of citi

hdu4305Lightning 生成树计数(基尔霍夫矩阵)+高斯消元+逆元

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4305 题意:比较裸的生成树计数问题. 如何处理生成树计数问题? 基尔霍夫矩阵: if i==j  Kir[i][j] = i的度数 if i!=j   Kir[i][j] = i到j的平行边的个数的负数 即,基尔霍夫矩阵 = 度数矩阵 - 邻接矩阵 将基尔霍夫矩阵删去第i行和第i列,余下i-1阶的行列式的值即为生成树个数.(证明略) 求行列式的值可以将行列式转为上三角阵,求对角线上的积即为行列式的值.

[bzoj1002][FJOI2007]轮状病毒-题解[基尔霍夫矩阵][高精度][递推]

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input

bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元

基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 15125 39601  103680  271441    710645      1860496 第1.3.5.7...[奇数位]位是平方数 : 1*1  4*4  11*11   29*29   76*76   199*199  521*521... 第2.4.6.8...[偶数位]位除以5后也是平

[BZOJ1002] [FJOI2007] 轮状病毒 (基尔霍夫矩阵)

Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source Solution 基尔霍夫矩阵,左转生成树的计数及其应用 推出本题的递推式:f[n] = f[n - 1] * 3 - f[n - 2] + 2 如果你能看懂,拜托给我讲讲,本人不懂. 注意要使用高精度 1 #include <cstri

bzoj 1002 [FJOI2007]轮状病毒 高精度&amp;&amp;找规律&amp;&amp;基尔霍夫矩阵

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Status] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source 基尔霍夫矩阵总算编出来了,这道题考

BZOJ 1002 + SPOJ 104 基尔霍夫矩阵 + 一个递推式。

BZOJ 1002 高精度 + 递推 f[1] = 1; f[2] = 5; f[i] = f[i - 1] * 3 - f[i - 2] + 2; SPOJ 104 裸 + 不用Mod 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std;

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<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Outpu

康复计划#5 Matrix-Tree定理(生成树计数)的另类证明和简单拓展

本篇口胡写给我自己这样的什么都乱证一通的口胡选手 以及那些刚学Matrix-Tree,大致理解了常见的证明但还想看看有什么简单拓展的人- 大概讲一下我自己对Matrix-Tree定理的一些理解.常见版本的证明.我自己的证明,以及简单的一些应用(比如推广到有向图.推广到生成树边权的乘积和什么的,非常基础). 应该看到这里的人都知道Matrix-Tree定理是干什么的吧-就是统计一个无向图的生成树个数,表示成一个行列式. 1.前置定义及性质 首先是Matrix-Tree定理相关的定义:对于一个无向图