首页 > 其他分享 >AT_jsc2021_g Spanning Tree 题解

AT_jsc2021_g Spanning Tree 题解

时间:2024-09-24 15:26:24浏览次数:1  
标签:int 题解 310 Tree long fa jsc2021 res mod

感觉自己稍微有一点唐了。

思路

我们首先可以把一定要连的边连起来。

这样就变成了一个无向图生成树计数问题。

如何求解。

使用矩阵树定理!

我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。

时间复杂度:\(O(n^3)\)。

Code

#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;

int n, m;
int fa[310];
int id[310];
int a[310][310];
int f[310][310];

inline int gf(int x) { return (x == fa[x] ? x : fa[x] = gf(fa[x])); }
inline long long power(long long x, long long y) {
  long long res = 1;
  while (y) { if (y & 1) res = res * x % mod; x = x * x % mod, y /= 2; }
  return res;
}

int main() {
  cin >> n;
  iota(fa + 1, fa + n + 1, 1);
  for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cin >> a[i][j];
  for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++)
    if (a[i][j] == 1) {
      if (gf(i) == gf(j)) cout << 0 << "\n", exit(0);
      fa[gf(i)] = gf(j);
    }
  for (int i = 1; i <= n; i++) if (fa[i] == i) id[i] = ++m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (a[i][j] == -1) {
        f[id[gf(i)]][id[gf(j)]]--;
        f[id[gf(i)]][id[gf(i)]]++;
      }
  int ans = 1;
  for (int i = 1; i < m; i++) {
    int p = i;
    for (int j = i; j < m; j++) if (f[j][i]) p = i;
    if (p != i) ans = ans * -1, swap(f[p], f[i]);
    int q = power(f[i][i], mod - 2);
    for (int j = i + 1; j < m; j++) {
      int z = 1ll * f[j][i] * q % mod;
      for (int k = 1; k <= m; k++) {
        f[j][k] = (f[j][k] - 1ll * z * f[i][k]) % mod;
      }
    }
  }
  for (int i = 1; i < m; i++) ans = 1ll * ans * f[i][i] % mod;
  cout << (ans + mod) % mod << "\n";
}

标签:int,题解,310,Tree,long,fa,jsc2021,res,mod
From: https://www.cnblogs.com/JiaY19/p/18429186

相关文章

  • Count Equation Solutions 题解
    前言题目链接:洛谷;UVA。题意简述求以下方程解的个数:\[a_1x_1-a_2x_2+a_3x_3-a_4x_4+a_5x_5-a_6x_6=0\]其中\(1\leqx_i\leqm\leq10^2\),\(x_i\in\mathbb{Z}\),多测。题目分析把\(a_2,a_4,a_6\)变成其相反数,变成\(\sum\limits_{i=1}^6a......
  • 题解 [ARC184B] 123 Set
    个人认为思维难点相同的三倍经验:P3226[HNOI2012]集合选数、TFSETS-Triple-FreeSets。区别在于状压DP的方法。我们称不包含质因子\(2\)和\(3\)的数为\(2,3\texttt{-Free}\)的。对于\([1,n]\)内每个\(2,3\texttt{-Free}\)的整数\(u\),可以列出以下的矩阵:\[\begi......
  • NEERC2013题解
    B.BonusCards简单dp一下,记\(f_{ij}\)为前i次有j次分给第一类的概率。最后再算上我在第一类被选上的概率即可。constintN=3005;#defineintlonglongintn,a,b;doublef[N][N],g[N][N];signedmain(void){#ifdefONLINE_JUDGE freopen("bonus.in","r",stdin......
  • 题解:CF888G Xor-MST
    题解:CF888GXor-MST题目大意:给定\(n\)个点的点权,任意两点间边权是点权的异或和。求这张完全图的MST的权值。思路:Boruvka+Trie树+按位贪心。关键就在于如何求出Boruvka中的best数组。考虑对点权建trie树,对于节点\(i\)本轮的连边,就是找“和它最相似”的那......
  • SP1825 FTOUR2 - Free tour II 题解
    题目传送门前置知识点分治|树状数组解法维护点对信息,考虑点分治。本题比luoguP4149[IOI2011]Race多了个前缀查询\(\max\)。套个支持单点修改、区间查询\(\max\)的数据结构即可。直接线段树维护区间\(\max\)貌似会TLE,换成树状数组维护前缀\(\max\)即可。注......
  • LGP3183 题解
    原题链接:P3183[HAOI2016]食物链。难度:Easy。根据定义,食物链是一个DAG,所以可以进行拓扑排序。食物链也就转化成了:图中从一个入度为\(0\)的点到一个出度为\(0\)的点的路径。那么只需要拓扑排序求出所有起点到每个点的路径条数,然后累加出度为\(0\)的点的值即可。需要注......
  • LGP1901 题解
    原题链接:P1901发射站难度:Easy。注意到"最近的且比它高",容易想到用单调栈维护每个能量发射站左右第一个比它高的,最后统计答案即可。具体的令f[i][0/1]表示能量发射站\(i\)右边/左边第一个\(h_x>h_i\)的位置\(x\)。用单调栈从左向右扫一遍,得到f[i][0]。用单调栈从右......
  • [题解] ICPC网络预选赛 2024 第二场 E Escape (含题目翻译)
    [题解]ICPC网络预选赛2024第二场EEscape(含题目翻译)tag:图论、BFS、最短路题干为原文DeepL翻译题目描述Sneaker在一个巨大的迷宫中醒来,现在他想逃离这个迷宫。通过迷宫中每个房间的地图,Sneaker了解了迷宫的结构。迷宫由......
  • 【题解】Solution Set - NOIP2024集训Day36 dp 优化 + 状态设计
    【题解】SolutionSet-NOIP2024集训Day36dp优化+状态设计https://www.becoder.com.cn/contest/5550最后一题较难。「NOIP2023」天天爱打卡考虑dp。\(f_{i,j}\):前\(i\)天,到第\(i\)天为止连续打卡\(j\)天。有转移:\[f_{i,0}=\max(f_{i,j})\\f_{i,j}=\max(f_{i......
  • Codeforces Round 972(Div.2)题解
    CodeforcesRound972(Div.2)题解A.SimplePalindrome贪心贪心,尽可能元素数量平均,并且相同字母放在一起。#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#de......