zoukankan      html  css  js  c++  java
  • UvaLive 6600 Spanning trees in a secure lock pattern 矩阵行列式

    链接:https://icpcarchive.ecs.baylor.edu/index.php?

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=4611

    题意:给一个N*N个点的矩阵(N<=6)。每一个点仅仅能和周围八个点相连,问有多少种生成树的方式。

    思路:题里给的非常明确。就是列一个每一个点的边的矩阵,然后求子矩阵的行列式就能够了,由于N仅仅有6,所以打表就能够了。

    打表代码:

    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <ctype.h>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <string>
    #include <vector>
    #define eps 1e-8
    #define INF 0x7fffffff
    #define PI acos(-1.0)
    #define seed 31//131,1313
    typedef long long LL;
    typedef unsigned long long ULL;
    using namespace std;
    #define MOD 1000
    #define maxn 40
    #define maxm 40
    struct Matrix
    {
        int n,m;
        double a[maxn][maxm];
        void change(int c,int d)
        {
            n=c;
            m=d;
            for(int i=0; i<n; i++)
                for(int j=0; j<m; j++)
                    a[i][j]=0;
        }
        void Copy(const Matrix &x)
        {
            n=x.n;
            m=x.m;
            for(int i=0; i<n; i++)
                for(int j=0; j<m; j++)
                    a[i][j]=x.a[i][j];
        }
        void build(int n)
        {
            change(n*n,n*n);
            for(int i=0; i<n*n; i++)
            {
                if(i%n!=0)
                {
                    a[i][i-1]=-1;
                    a[i-1][i]=-1;
                    a[i][i]++;
                    a[i-1][i-1]++;
                }
                if(i%n!=0&&i/n!=0)
                {
                    a[i][i-n-1]=-1;
                    a[i-n-1][i]=-1;
                    a[i][i]++;
                    a[i-n-1][i-n-1]++;
                }
                if(i%n!=0&&i/n!=n-1)
                {
                    a[i][i+n-1]=-1;
                    a[i+n-1][i]=-1;
                    a[i][i]++;
                    a[i+n-1][i+n-1]++;
                }
                if(i/n!=n-1)
                {
                    a[i][i+n]=-1;
                    a[i+n][i]=-1;
                    a[i][i]++;
                    a[i+n][i+n]++;
                }
            }
        }
        double det()
        {
            for(int i=1; i<n; i++)
            {
                for(int j=0; j<i; j++)
                    if(a[i][j]!=0)
                    {
                        for(int k=j+1; k<m; k++)
                            a[i][k]-=(a[j][k]*a[i][j]/a[j][j]);
                        a[i][j]=0;
                    }
            }
            double ans=1;
            for(int i=0; i<n-1; i++)
                ans*=a[i][i];
            return ans;
        }
    };
    int main()
    {
        int t;
        scanf("%d",&t);
        Matrix A;
        A.build(t);
        printf("%.0f
    ",A.det());
        return 0;
    }
    
    AC代码:

    int main()
    {
        char ss[10][40]={"1","16","17745","1064918960","3271331573452806","504061943351319050000000"};
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int a;
            scanf("%d",&a);
            puts(ss[a-1]);
        }
    }
    


  • 相关阅读:
    处理集合_创建Set
    处理集合_通过对象模拟Set
    处理集合_key相等
    处理集合_创建第1个map
    idea实用快捷键
    Typroa 常用快捷键
    关于IDEA无法加载main方法的bug
    TCP通信的实现代码
    用GUI实现java版贪吃蛇小游戏
    UDP实现在线聊天功能
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6937327.html
Copyright © 2011-2022 走看看