• SP104 HIGH


    题面

    Matrix Tree 定理 模板,行列式的值用高斯消元

    代码

    #include<bits/stdc++.h>
    #define LL long long
    #define int LL
    
    using namespace std;
    const int MAXN = 1005;
    const double eps = 1e-7;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
        return x*f;
    }
    
    int n,m,T,is[MAXN];
    int du[MAXN][MAXN];
    int a[MAXN][MAXN];
    double ans[MAXN][MAXN];
    LL ANS=1;
    
    inline void gauss(int n){
        double ret=1;
        int h=1,l=1;
        for(;h<=n && l<=n;h++,l++){
            int r=h;
            for(register int i=h+1;i<=n;i++)
                if(fabs(ans[i][l])>fabs(ans[r][l])) r=i;
            if(fabs(ans[r][l])<eps) {h--;continue;}
            if(r!=h){
                for(register int i=l;i<=n;i++)
                    swap(ans[h][i],ans[r][i]);
                ret=-ret;
            }
            for(register int i=h+1;i<=n;i++)
            if(fabs(ans[i][l])>eps){    
                double tmp=ans[i][l]/ans[h][l];
                for(register int j=l+1;j<=n;j++)
                    ans[i][j]-=tmp*ans[h][j];
                ans[i][l]=0;
            }
        }
    //  for(register int i=1;i<=n;i++){
    //      for(register int j=1;j<=n;j++)
    //          cout<<ans[i][j]<<" ";
    //      cout<<endl;
    //  }
        for(register int i=1;i<=n;i++)
            ret*=ans[i][i];
        printf("%lld
    ",(LL)(fabs(ret)));
    }
    
    signed main(){
        T=rd();
        while(T--){
            n=rd();m=rd();
            ANS=1;
            for(register int i=1;i<=n;i++)
                for(register int j=1;j<=n;j++)
                    ans[i][j]=du[i][j]=a[i][j]=0;
            for(register int i=1;i<=m;i++){
                int x,y;
                x=rd();y=rd();
                a[x][y]++;a[y][x]++;
                du[x][x]++;du[y][y]++;
            }
            for(register int i=1;i<=n;i++)
                for(register int j=1;j<=n;j++)
                    ans[i][j]=du[i][j]-a[i][j];
    //          for(register int i=1;i<=n;i++){
    //              for(register int j=1;j<=n;j++)
    //                  cout<<ans[i][j]<<" ";
    //              cout<<endl;
    //          }
            gauss(n-1);
        }
        return 0;
    }
  • 相关阅读:
    Windows 08 R2_组策略
    Nginx常用配置实例(4)
    Nginx日常维护操作(3)
    Nginx配置文件(2)
    Nginx概述和安装(1)
    Zabbix实战-简易教程--通过公众平台企业号发送短信
    HDFS ZKFC自动切换原理分析
    HDFS ZKFC自动切换原理分析
    DataNode启动优化改进:磁盘检测并行化
    DataNode启动优化改进:磁盘检测并行化
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677000.html
Copyright © 2020-2023  润新知