zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    4.22日日常记录
    ajax再接触
    一些小姿势
    打星功能
    悟透javascript读书笔记
    初接触eclipse和前后端调试问题 待续
    python实现后台员工管理系统
    python实现增删改查操作
    python实现6种方法打印九九乘法表
    python实现猜数字游戏
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677000.html
Copyright © 2011-2022 走看看