Friends
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 163 Accepted Submission(s): 61
Problem Description
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.
2 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1
0 2
题目大意:一些朋友关系可离线可在线,要求每个人的离线朋友数等于在线朋友数
题目分析:数据量不大,直接爆搜,记录每个点的度数,奇数的直接不可能,偶数的分成两个数组,c1[i]表示i的在线朋友数,c2[i]表示i的离线朋友数,然后一条边一条边搜就行了,注意一个剪枝,当一条边的两个端点有一个c值为0,则return
#include <cstdio>
#include <cstring>
bool mp[10][10];
int deg[10], c1[10], c2[10];
int n, m, cnt, ans;
struct EDGE
{
int u, v;
}e[100000];
void DFS(int cur)
{
if(cur == m + 1)
{
ans ++;
return;
}
int v = e[cur].v;
int u = e[cur].u;
if(c1[u] && c1[v])
{
c1[u] --;
c1[v] --;
DFS(cur + 1);
c1[u] ++;
c1[v] ++;
}
if(c2[u] && c2[v])
{
c2[u] --;
c2[v] --;
DFS(cur + 1);
c2[u] ++;
c2[v] ++;
}
return;
}
int main()
{
int T;
scanf("%d", &T);
while(T --)
{
cnt = 0;
ans = 0;
memset(deg, 0, sizeof(deg));
memset(e, 0, sizeof(e));
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++)
{
scanf("%d %d", &e[i].u, &e[i].v);
deg[e[i].u] ++;
deg[e[i].v] ++;
}
bool f = false;
for(int i = 1; i <= n; i++)
{
c1[i] = c2[i] = deg[i] / 2;
if(deg[i] & 1)
{
f = true;
break;
}
}
if(f)
{
printf("0\n");
continue;
}
DFS(1);
printf("%d\n", ans);
}
}
319



被折叠的 条评论
为什么被折叠?



