您的位置:首页 > 其它

buptoj:network

2016-04-01 20:23 274 查看


F. network 第十届北京邮电大学程序设计竞赛 - 热身赛 (2)

时间限制 3000 ms 内存限制 65536
KB


题目描述

A social network is a social structure made up of a set of social actors (such as individuals or organizations) and a set of the relationships between these actors. In simple cases, we may represent
people as nodes in a graph, and if two people are friends, then an edge occurs between two nodes.
There are many interesting properties in a social network. Recently, we are researching on the  SocialButterfly.
A social butterfly should satisfy the following conditions:
                                 

A
simple social network,where C knows everyone but D knows just C.
Now we have already had several networks in our database, but since the data only contain nodes and edges, we don't know whether a node represents a male or a female. We are interested, that
if there are equal probabilities for a node to be male and female (each with 1/2 probability).A node
is a social butterfly if and only if this node is a female and
connects with at least K males.What
will be the expectation of number of social butterflies in
the network?
 


输入格式

The number of test cases T(T≤104) will
occur in the first line of input.
For each test case:
The first line contains the number of nodes N(1≤N≤30)and
the parameter K (0 <= K < N))
Then an N×Nmatrix G followed,
where Gij=1 denotes j as a
friend of i,
otherwise Gij=0.
Here, it's always satisfied that Gii=0 and Gij=Gji for
all 1≤i,j≤N.


输出格式

For each test case, output the expectation of number of social butterflies in 3 decimals.
 
 
##Hint
In the first sample, there are totally 4 cases: {Female, Female}, {Female,

Male},{Male, Female} and {Male, Male}, whose number of social butterflies

are respectively 0, 1, 1, 0. Hence, the expectation should be

E=14×0+14×1+14×1+14×0=12


输入样例

2
2 1
0 1
1 0
3 1
0 1 1
1 0 1
1 1 0



输出样例

0.500
1.125


题意挺晦涩难懂的。。。

实际上就是给出一个图,一个节点两种颜色,问有多少个节点至少连接k个不同节点。。。

和自己相连的部分c[lin[k]][k]到c[lin[k]][lin[k]],不和自己相连的2^x。

代码:

/*
USER_ID: test#wangchong756
PROBLEM: 971
SUBMISSION_TIME: 2016-04-01 18:07:22
*/
#pragma warning(disable:4996)
#include <iostream>
#include <functional>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
using namespace std;
typedef long long ll;

#define INF 0x333f3f3f
#define repp(i, n, m) for (int i = n; i <= m; i++)
#define rep(i, n, m) for (int i = n; i < m; i++)
#define sa(n) scanf("%d", &(n))

const ll mod = 1000000007;
const int maxn = 2e5 + 5;
const double PI = acos(-1.0);

int n, k;
ll c[35][35], f[30];

void init()
{
int i, j;
memset(c, 0, sizeof(c));

for (i = 0; i <= 32; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0 || j == i)
c[i][j] = 1;
else
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
}
}
f[0] = 1;
for (i = 1; i <= 30; i++)
{
f[i] = (f[i - 1] << 1);
}
}

int lin[35], val[35][35];

void solve()
{
int i, j;
scanf("%d%d", &n, &k);

memset(lin, 0, sizeof(lin));

for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
scanf("%d", &val[i][j]);
lin[i] += val[i][j];
}
}
ll ans = 0;
for (i = 1; i <= n; i++)
{
ll ans1 = 0;
for (j = k; j <= lin[i]; j++)
{
ans1 += c[lin[i]][j];
}
ans1 = ans1*(ll)(f[n - 1 - lin[i]]);
ans += ans1;
}
double res = (double)ans / (double)f
;
printf("%.3lf\n", res);
}

int main()
{

int t;
init();
scanf("%d", &t);
while (t--)
{
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: