zzuli 1728: 社交网络【组合数学】

题目:zzuli1728
这里写图片描述
分析:从图论出发了,其实是组合数学问题;
对于每个点而言,和它相连的边作为一个集合进行排列组合,设异性为i个,则同性为n - i:

i = k n ( 1 2 ) i ( 1 2 ) n i C n i

这里的n代表每个点的度,由于每条边计算两次,最后除2即是结果;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int MAXN = 30 + 1;
LL dp[MAXN][MAXN];

void init() { //打印杨辉三角,代替组合数 
    dp[0][0] = 1;
    for(int i = 1; i < MAXN; ++i) {
        dp[i][0] = 1;
        for(int j = 1; j < MAXN; ++j) {
            dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
        }
    }
}

int main() {
    int T; init();
    scanf("%d", &T);
    while(T--) {
        int n, k, ant;
        double sum = 0.0;
        scanf("%d %d", &n, &k);
        for(int i = 0; i < n; ++i) {
            int ans = 0;
            for(int j = 0; j < n; ++j) {
                scanf("%d", &ant);
                if(ant) ans++;
            }
            for(int j = k; j <= ans; j++) {
                sum = sum + double(dp[ans][j]) * 1.0 / pow(2, ans);
            }
        }
        printf("%.3lf\n", sum / 2);
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_36368339/article/details/80052803