美文网首页
UVA10766(生成树计数)

UVA10766(生成树计数)

作者: Alan66 | 来源:发表于2017-07-16 00:43 被阅读0次

代码改模板没怎么改出来.看的别人的改的,还是有点不懂.

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=55;
typedef long long int ll;

int deg[MAX];
int g[MAX][MAX];
ll b[MAX][MAX];

ll Det(int n){
    int i,j,k;
    ll ret = 1;
    for(i=2;i<=n;i++){
        for(j = i+1;j <= n;j++){
            while(b[j][i]){  //如果该点未被连接
                ll tmp=b[i][i]/b[j][i];
                for(k = i;k <= n;k++)
                    b[i][k] -= tmp*b[j][k];
                for(k=i;k<=n;k++)
                    swap(b[i][k],b[j][k]);  //换列
                ret = -ret;
            }
        }
        if(!b[i][i]) return 0;
        ret *= b[i][i];
    }
    if(ret < 0) ret = -ret;
    return ret;

}

int main()
{
    int n,m,k;
    while(scanf("%d%d%d",&n,&m,&k) != EOF){
        int u,v;
        memset(deg,0,sizeof(deg));
        memset(g,0,sizeof(g));
        memset(b,0,sizeof(b));
        while(m--){
            scanf("%d%d",&u,&v);
            g[u][v] = 1;g[v][u] = 1;  //存入邻接矩阵

        }

        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= n;j++){
                if(!g[i][j] && i != j){
                     b[i][j] = -1;
                     deg[i]++;
                }
            }
        }
        for(int i = 1;i <= n;i++){
            b[i][i] = deg[i];     //建立度数矩阵
        }
          //下面注释的部分可以打印出矩阵
    /*
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                printf(" %d",b[i][j]);
            }puts("");
        }*/

        printf("%lld\n",Det(n));

    }
return 0;
}

相关文章

网友评论

      本文标题:UVA10766(生成树计数)

      本文链接:https://www.haomeiwen.com/subject/ugttkxtx.html