您的位置:首页 > 大数据 > 人工智能

2015 Multi-University Training Contest 2 Friends

2015-07-23 21:36 459 查看

Friends

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0


[align=left]Problem Description[/align]

There are n people and m pairs of friends. For every pair of friends, they can choose to become online friends (communicating using online applications) or offline friends (mostly using face-to-face communication). However, everyone in these n people wants to have the same number of online and offline friends (i.e. If one person has x onine friends, he or she must have x offline friends too, but different people can have different number of online or offline friends). Please determine how many ways there are to satisfy their requirements.

[align=left]Input[/align]

The first line of the input is a single integer T (T=100), indicating the number of testcases.

For each testcase, the first line contains two integers n (1≤n≤8) and m (0≤m≤n(n−1)2), indicating the number of people and the number of pairs of friends, respectively. Each of the next m lines contains two numbers x and y, which mean x and y are friends. It is guaranteed that x≠y and every friend relationship will appear at most once.

[align=left]Output[/align]

For each testcase, print one number indicating the answer.

[align=left]Sample Input[/align]

2

3 3

1 2

2 3

3 1

4 4

1 2

2 3

3 4

4 1

[align=left]Sample Output[/align]

0

2

解题:直接枚举边很草啊。。。貌似别人都是枚举点,每个点的最后一条边可以推算出来。。。而哥直接艹了。。。

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 50;
struct arc {
int u,v;
} e[maxn];
int st[maxn],du[maxn],n,m,ret;
bool check() {
for(int i = 1; i <= n; ++i)
if(st[i]) return false;
return true;
}
bool check2(int x){
if(st[x] == 0 && (du[x]&1) == 0) return true;
int tmp = st[x]<0?du[x]+st[x]:du[x]-st[x];
if(st[x] < 0 && tmp >= 0 && (tmp&1) == 0) return true;
if(st[x] > 0 && tmp >= 0 && (tmp&1) == 0) return true;
return false;
}
void dfs(int cur) {
if(cur == m) {
if(check()) ++ret;
return;
}
++st[e[cur].u];
++st[e[cur].v];
--du[e[cur].u];
--du[e[cur].v];
if(check2(e[cur].u) && check2(e[cur].v)) dfs(cur+1);
st[e[cur].v] -= 2;
st[e[cur].u] -= 2;
if(check2(e[cur].u && check2(e[cur].v))) dfs(cur+1);
++st[e[cur].v];
++st[e[cur].u];
++du[e[cur].u];
++du[e[cur].v];
}
int main() {
int kase;
scanf("%d",&kase);
while(kase--) {
scanf("%d%d",&n,&m);
memset(du,0,sizeof du);
memset(st,0,sizeof st);
for(int i = ret = 0; i < m; ++i) {
scanf("%d%d",&e[i].u,&e[i].v);
++du[e[i].u];
++du[e[i].v];
}
bool flag = true;
for(int i = 1; i <= n && flag; ++i)
if(du[i]&1) flag = false;
if(flag) dfs(0);
printf("%d\n",ret);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: