SPOJ104 Highways,生成树计数

高速公路(SPOJ104 Highways)

一个有n座城市的组成国家,城市1至n编号,其中一些城市之间可以修建高速公路。现在,需要有选择的修建一些高速公路,从而组成一个交通网络。你的任务是计算有多少种方案,使得任意两座城市之间恰好只有一条路径?

数据规模:1≤n≤12。

生成树计数

算法步骤:

1、 构建拉普拉斯矩阵

Matrix[i][j] =

degree(i) , i==j

-1,i-j有边

0,其他情况

2、 去掉第r行,第r列(r任意)

3、 计算矩阵的行列式

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 105;
const int maxm = 100005;
const int INF = 1e9;
int degree[maxn];
ll g[maxn][maxn];
int n, m;

ll det(ll a[][maxn], int n)
{
    ll ret = 1;
    for(int i=1; i<n; ++i){
        for(int j=i+1; j<n; ++j){
            while(a[j][i]){
                ll t = a[i][i]/a[j][i];
                for(int k=i; k<n; ++k){
                    a[i][k] = (a[i][k]-a[j][k]*t);
                }
                for(int k=i; k<n; ++k){
                    swap(a[i][k], a[j][k]);
                }
                ret = -ret;
            }
        }
        if(a[i][i]==0){
            return 0;
        }
        ret = ret*a[i][i];
    }
    if(ret<0){
        ret = -ret;
    }
    return ret;
}

void solve()
{
    int u, v;
    memset(degree, 0, sizeof degree );
    memset(g, 0, sizeof g );
    scanf("%d%d", &n, &m);
    while(m--){
        scanf("%d%d", &u, &v);
        u--,v--;
        g[u][v] = g[v][u] = -1;
        degree[u]++;
        degree[v]++;
    }
    for(int i=0; i<n; ++i){
        g[i][i] = degree[i];
    }
    printf("%lld\n", det(g, n));
}

int main()
{
    int t;
    scanf("%d", &t);
    while(t--){
        solve();
    }
    return 0;
}
时间: 2024-08-12 17:48:27

SPOJ104 Highways,生成树计数的相关文章

[spoj104][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 cities that can be c

SPOJ - HIGH :Highways (生成树计数)

Highways 题目链接:https://vjudge.net/problem/SPOJ-HIGH Description: 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 whi

SPOJ104 Highways,跨越数

高速公路(SPOJ104 Highways) 一个有n座城市的组成国家,城市1至n编号,当中一些城市之间能够修建快速公路.如今,须要有选择的修建一些快速公路.从而组成一个交通网络.你的任务是计算有多少种方案,使得随意两座城市之间恰好仅仅有一条路径? 数据规模:1≤n≤12. 生成树计数 算法步骤: 1. 构建拉普拉斯矩阵 Matrix[i][j] = degree(i) , i==j -1,i-j有边 0,其它情况 2. 去掉第r行,第r列(r随意) 3. 计算矩阵的行列式 #include <

SPOJ104. Highways

104. Highways Problem code: HIGH 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 ha

生成树计数

生成树计数就是统计一张图中一共有多少种构造生成树的方案. 大概要用到组合数学等等的数学知识. 以下内容均来自NOI2007国家集训队论文 周冬 <生成树的计数及其应用>: ------------------------- Matrix-Tree定理(Kirchhoff矩阵-树定理).Matrix-Tree定理是解决生成树计数问题最有力的武器之一.它首先于1847年被Kirchhoff证明.在介绍定理之前,我们首先明确几个概念: 1.G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

生成树计数 Matrix-Tree 定理

一直都知道要用Matrix-Tree定理来解决生成树计数问题,但是拖到今天才来学.博主数学不好也只能跟着各位大佬博客学一下它的应用以及会做题,证明实在是不会. 推荐博客https://blog.csdn.net/u011815404/article/details/89091011(Matrix-Tree定理) https://blog.csdn.net/u011815404/article/details/99679527(写得无敌好的生成树计数了) 那么比较常见的生成树计数问题就三种:①生成

bzoj1002 生成树计数 找规律

这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了. 用高精度?有分数出现. 用辗转相除的思想,让它不出现分数.但过程中会出现负数,高精度处理负数太麻烦. 用Python打表?好吧,Python还不熟,写不出来..... 所以,如果这道题我考场上遇到,最多用double骗到n<=20的情况的部分分. 最终只能求助于题解了... 好像是通过观察行列式的特点,推导出关于答案f(n)的递推式(f(n)=

Uva 10766 Organising the Organisation (Matrix_tree 生成树计数)

题目描述: 一个由n个部门组成的公司现在需要分层,但是由于员工间的一些小小矛盾,使得他们并不愿意做上下级,问在满足他们要求以后有多少种分层的方案数? 解题思路: 生成树计数模板题,建立Kirchhoff矩阵,利用Matrix_tree定理求解. Kirchhoff矩阵:假设G为n*n矩阵,C为G的入度矩阵(i==j时,C[i][j]等于i的入度;i!=j时,C[i][j]等于零),A为G的邻接矩阵,那么就有Kirchhoff矩阵等于C-A. Matrix_tree定理:G的不同生成树的个数等于其