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
相关文章推荐
- Container With Most Water
- fork http://baike.baidu.com/link?url=NtmCc5dQQrmeNnKLTcfjH1lmuH-YVrQqN9wITIAxrJTzcEaQDaS26wxV7V0BagE
- HDU-1023 Train Problem II(卡特兰数)
- 使用 DB Fixtures 为 Unit Test 提供基础数据,Sails + Mocha 实现。
- 2015 Multi-University Training Contest 2 1006 Friends 壮压
- 2015 HUAS Summer Training#2~E
- 2015多校联合训练赛 hdu 5305 Friends 2015 Multi-University Training Contest 2 枚举+剪枝
- main参数介绍
- 2015 Multi-University Training Contest 2 1006
- 基于Pre-Train的CNN模型的图像分类实验
- Hdu 5305 Friends 2015 Multi-University Training Contest 2
- HDU 5235 Friends (2015 Multi-University Training Contest 2 搜索+剪枝)
- LeetCode#70 Climbing Stairs
- 2015 Multi-University Training Contest 2 1004 苹果树 dp+单调队列
- 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
- 2015 Multi-University Training Contest 2 1006 Friends
- 理解OpenContrail(by quqi99)
- Lua中闭包详解 来自RingOfTheC[ring.of.the.c@gmail.com]
- activity_main.xml
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)