HDU 5305 Friends
2015-07-25 12:14
323 查看
思路:总的来说,就是按边dfs+剪枝,具体见代码注释。
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#define N 10
#define M 30
#define LL long long
#define mod 1000000007
using namespace std;
int n, m;
int ans;
int num
;
int on
, off
; //第i个人online朋友的个数和offline朋友的个数
struct Edge{
int a, b;
}edge[M];
void init(){
memset(num, 0, sizeof num);
memset(on, 0, sizeof on);
memset(off, 0, sizeof off);
ans = 0;
cin >> n >> m;
for (int i = 0; i < m; i++){
int a, b;
scanf("%d %d", &a, &b);
edge[i].a = a, edge[i].b = b;
num[a]++, num[b]++;
}
return;
}
void dfs(int e){
if (e == m){
ans++;
return;
}
int a = edge[e].a;
int b = edge[e].b;
num[a]--, num[b]--;
on[a]++; on[b]++;
int flag = false;
if (num[a] && num[b])flag = true;
if (!num[a] && num[b] && on[a] == off[a])flag = true;
if (num[a] && !num[b] && on[b] == off[b])flag = true;
if (!num[a] && !num[b] && on[a] == off[a] && on[b] == off[b])flag = true;
if (flag)dfs(e + 1);
on[a]--, on[b]--, flag = false;
off[a]++; off[b]++;
if (num[a] && num[b])flag = true;
if (!num[a] && num[b] && on[a] == off[a])flag = true;
if (num[a] && !num[b] && on[b] == off[b])flag = true;
if (!num[a] && !num[b] && on[a] == off[a] && on[b] == off[b])flag = true;
if (flag)dfs(e + 1);
off[a]--; off[b]--;
num[a] ++; num[b]++;
return;
}
int main(){
int t;
cin >> t;
while (t--){
init();
dfs(0);
cout << ans << endl;
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#define N 10
#define M 30
#define LL long long
#define mod 1000000007
using namespace std;
int n, m;
int ans;
int num
;
int on
, off
; //第i个人online朋友的个数和offline朋友的个数
struct Edge{
int a, b;
}edge[M];
void init(){
memset(num, 0, sizeof num);
memset(on, 0, sizeof on);
memset(off, 0, sizeof off);
ans = 0;
cin >> n >> m;
for (int i = 0; i < m; i++){
int a, b;
scanf("%d %d", &a, &b);
edge[i].a = a, edge[i].b = b;
num[a]++, num[b]++;
}
return;
}
void dfs(int e){
if (e == m){
ans++;
return;
}
int a = edge[e].a;
int b = edge[e].b;
num[a]--, num[b]--;
on[a]++; on[b]++;
int flag = false;
if (num[a] && num[b])flag = true;
if (!num[a] && num[b] && on[a] == off[a])flag = true;
if (num[a] && !num[b] && on[b] == off[b])flag = true;
if (!num[a] && !num[b] && on[a] == off[a] && on[b] == off[b])flag = true;
if (flag)dfs(e + 1);
on[a]--, on[b]--, flag = false;
off[a]++; off[b]++;
if (num[a] && num[b])flag = true;
if (!num[a] && num[b] && on[a] == off[a])flag = true;
if (num[a] && !num[b] && on[b] == off[b])flag = true;
if (!num[a] && !num[b] && on[a] == off[a] && on[b] == off[b])flag = true;
if (flag)dfs(e + 1);
off[a]--; off[b]--;
num[a] ++; num[b]++;
return;
}
int main(){
int t;
cin >> t;
while (t--){
init();
dfs(0);
cout << ans << endl;
}
return 0;
}
相关文章推荐
- h323
- 如何恢复、打开、开启默认共享ipc$ c$ Dameware安装出错
- 【YII2学习笔记】20150725-1
- web自学
- Drupal 7 安装时的数据库问题
- 微信支付商户发放现金红包操作说明
- [LeetCode] Search a 2D Matrix II
- WebService基本
- Openssl pkeyutl命令
- Leetcode 13 Roman to Integer
- HDU 1048 The Hardest Problem Ever
- android SDK问题
- IRC相关频道
- 黑马程序员——集合框架(泛型限定)
- VS2013 API方法连接 64位 MySQL56
- RMQ问题--ST算法(Sparse Table)
- C#中对泛型List进行分组输出元素
- [POJ 1832] 连环锁 格雷码
- 线程的同步异步,以及具体代码实现,使用场景
- 2张图片叠放,根据鼠标的移动来显示