HYSBZ - 3534 重建 变元矩阵-树定理

这题真心不错,,刷新了我对matrix-tree定理的认识,

现在我对MT定理的认识是:

可以计算

有向图的每颗外/内向树的边权值的乘积的和

 

无向图图的每颗生成树的边权值的乘积的和

特别的,当边权为1时,就是生成树的数量 

 

 

 

 

#include
using namespace std;
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define FIN freopen("input.txt","r",stdin);
#define mem(x,y) memset(x,y,sizeof(x));
typedef unsigned long long ULL;
typedef long long LL;
#define fuck(x) cout<, int> PIII;
typedef pair PII;
const double eps = 1e-10;
const double PI = acos(-1);
const int P = 1e9 + 7;
const int MX = 333;
int n;
double mat[MX][MX];
//会改变原来的矩阵,可以先备份一份
double MT(double w[][MX],int n,int g)   //g为有向图根节点编号,无向图随便填个
{
    if(n==1)return 1;//如果只有一个点就是1
    //将根节点和0节点互换,注意会改变原先的矩阵
    for(int i=0; ifabs(w[t][i]))
            {
                t=j;
            }
        if(t!=i) for(int j=i; jeps)
            {
                double v=w[j][i]/w[i][i];
                for(int k=i; k<=n+1; k++) w[j][k]=w[j][k]-w[i][k]*v;
            }
    }
    double  ans=1;
    for(int i=1; i

 

 

 

 

 

你可能感兴趣的:(ACM)