E041. Матричная теорема Кирхгофа. Нахождение количества остовных деревьев

e-maxx algorithm original: C/C++ #algorithm #emaxx #graph #tree
题目文本会按所选界面语言从俄语翻译;代码保持不变。

Источник: e-maxx.ru/algo, страница PDF 125.

Задан связный неориентированный 图 своей матрицей смежности. Кратные рёбра в 图е допускаются. it is required посчитать количество различных остовных деревьев этого 图а. Приведённая ниже формула принадлежит Кирхгофу (Kirchhoff), который доказал её в 1847 г.

Матричная теорема Кирхгофа

Возьмём матрицу смежности 图а G, заменим каждый element этой матрицы на противоположный, а на диагонале вместо elementа Ai,i поставим степень вершины i (если имеются кратные рёбра, то в степени вершины они учитываются со своей кратностью). Тогда, согласно матричной теореме Кирхгофа, все алгебраические дополнения этой матрицы равны между собой, и равны количеству остовных деревьев этого 图а. На示例, можно удалить последнюю строку и последний столбец этой матрицы, и модуль её определителя будет равен искомому количеству. Определитель матрицы можно find за O (N3) с помощью метода Гаусса или метода Краута. 证明 этой теоремы достаточно сложно и здесь не приводится (см., на示例, Приезжев В.Б. "题目 о димерах и теорема Кирхгофа").

Связь с законами Кирхгофа в электрической цепи

Между матричной теоремой Кирхгофа и законами Кирхгофа для электрической цепи имеется удивительная связь. Можно показать (как следствие из закона Ома и первого закона Кирхгофа), что сопротивление Rij между точками i и j электрической цепи равно:

Rij = |T(i,j)| / |Tj|

где матрица T получена из матрицы A обратных сопротивлений проводников (Aij - обратное number к сопротивлению проводника между точками i и j) преобразованием, описанным в матричной теореме Кирхгофа, а обозначение T(i) обозначает вычёркивание строки и столбца с номером i, а T(i,j) - вычёркивание двух строк и столбцов i и j. Теорема Кирхгофа придаёт этой формуле геометрический смысл.

C# 解法

自动草稿,提交前请检查
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    Rij = |T(i,j)| / |Tj|
}

C++ 解法

匹配/原始
Rij = |T(i,j)| / |Tj|

Java 解法

自动草稿,提交前请检查
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    Rij = |T(i,j)| / |Tj|
}

Материал разбит как 算法ическая 题目: изучить постановку, понять асимптотику и реализовать 算法 на выбранном языке.

Vacancies for this task

活跃职位 with overlapping task tags are 已显示.

所有职位
目前还没有活跃职位。