我是靠谱客的博主 生动咖啡豆,最近开发中收集的这篇文章主要介绍Uva10766 Organising the Organisation,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接戳这里
基尔霍夫矩阵裸题。构建基尔霍夫矩阵(度数矩阵-邻接矩阵),求他的任意(n-1)阶主子式的绝对值即为答案。
这题开始用java写,结果BigInteger太慢Tle了。
后来用c++写了个crt,不知道为什么wa了。
最后用long double强上最后输出转long long,ac了。
注意:给出的边可能有重复的。

#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef long double ld;
typedef long long ll;
#define maxn (60)
#define eps (1e-7)
int N,M,K; ld A[maxn][maxn]; ll ans;

inline ld guass()
{
    ld ret = 1; bool sign = false;
    for (int i = 1,j;i < N;++i)
    {
        for (j = i;j < N;++j) if (fabs(A[j][i]) > eps) break;
        if (j == N) { sign = true; break; }
        for (int k = 1;k < N;++k) swap(A[i][k],A[j][k]);
        ld inv = A[i][i]; ret *= inv;
        for (j = i;j < N;++j) A[i][j] /= inv;
        for (j = i+1;j < N;++j)
        {
            ld t = A[j][i];
            for (int k = i;k < N;++k) A[j][k] -= t*A[i][k];
        }
    }
    if (sign) ret = 0;
    return fabs(ret);
}

int main()
{
    freopen("10766.in","r",stdin);
    freopen("10766.out","w",stdout);
    while (scanf("%d %d %d",&N,&M,&K) != EOF)
    {
        for (int i = 1;i <= N;++i)
            for (int j = 1;j <= N;++j)
            {
                if (i != j) A[i][j] = 1;
                else A[i][i] = 0;
            }
        while (M--)
        {
            int a,b; scanf("%d %d",&a,&b);
            A[a][b] = A[b][a] = 0;
        }
        for (int i = 1;i <= N;++i)
            for (int j = 1;j <= N;++j)
                if (i != j&&A[i][j] > eps) A[i][i]--;
        printf("%lldn",(ll)(guass()+0.5));
    }
    fclose(stdin); fclose(stdout);
    return 0;
}

转载于:https://www.cnblogs.com/mmlz/p/6171201.html

最后

以上就是生动咖啡豆为你收集整理的Uva10766 Organising the Organisation的全部内容,希望文章能够帮你解决Uva10766 Organising the Organisation所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部