解题报告 之 HDU5305 Friends


Description

There are  people
and  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 

rev=2.4-beta-2" alt="" style=""> people
wants to have the same number of online and offline friends (i.e. If one person has  onine
friends, he or she must have  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. 

 

Input

The first line of the input is a single integer 

rev=2.4-beta-2" alt="" style="">,
indicating the number of testcases. 



For each testcase, the first line contains two integers 

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style=""> and 

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style="">,
indicating the number of people and the number of pairs of friends, respectively. Each of the next  lines
contains two numbers  and 

rev=2.4-beta-2" alt="" style="">,
which mean  and  are
friends. It is guaranteed that 

rev=2.4-beta-2" alt="" style="">

rev=2.4-beta-2" alt="" style=""> and
every friend relationship will appear at most once. 

 

Output

For each testcase, print one number indicating the answer.
 

Sample Input

2
3 3
1 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
 

Sample Output

0
2

题目大意:有n个人,当中有m对朋友。既可能是网络上的朋友,也可能是现实中的朋友。如今要求每一个人网络上的朋友和现实中的朋友数量相等。但每一个人之前的朋友数量能够是不一样的,如今让你决定每一对朋友是网络朋友还是现实中的朋友来满足这个要求。问有分配方法?

分析:这道题就暴力搜索就能够了,遍历每一条边,去决定是网络朋友和现实朋友。注意剪枝假设当前边的两点中某一点的某种朋友已经超过了它关系的一半,则不用再继续搜索,由于已经不可能了。

上代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
typedef long long ll; int de[10];
int in[100], out[100];
int on[10], off[10];
int ans, m, n; void dfs( int u )
{
if(u == m + 1)
{
for(int i = 1; i <= n; i++)
{
if(on[i] != off[i]) return;
}
ans++;
return;
} if(on[in[u]] < de[in[u]] / 2 && on[out[u]] < de[out[u]]/2)
{
on[in[u]]++; on[out[u]]++;
dfs( u + 1 );
on[in[u]]--; on[out[u]]--;
} if(off[in[u]] < de[in[u]] / 2 && off[out[u]] < de[out[u]]/2)
{
off[in[u]]++; off[out[u]]++;
dfs( u + 1 );
off[in[u]]--; off[out[u]]--;
}
} int main()
{
int kase; scanf( "%d", &kase );
while(kase--)
{
memset( de, 0, sizeof de );
memset( on, 0, sizeof on );
memset( off, 0, sizeof off );
ans = 0; scanf( "%d%d", &n, &m );
for(int i = 1; i <= m; i++)
{
scanf( "%d%d", &in[i], &out[i] );
de[in[i]]++; de[out[i]]++;
} int flag = true;
for(int i = 1; i <= n; i++)
{
if(de[i] % 2 == 1)
{
printf( "0\n" );
flag = false;
break;
}
} if(!flag) continue; dfs( 1 );
printf( "%d\n", ans );
}
return 0;
}


解题报告 之 HDU5305 Friends的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 项目: python爬虫 福利 煎蛋网妹子图

    嘿嘿嘿! 嘿嘿嘿! 福利一波, 之前看小甲鱼的python教学视频的时候, 看到上面教的爬虫, 爬美女图片的, 心很痒痒, 但是不知道为啥, 按照视频一个字一个字敲的代码,总是报错, 有一天花了 一下 ...

  2. Android开发之ConstraintLayout相对布局

    介绍 一个 ConstraintLayout 是一个 ViewGroup 允许您以灵活的方式定位和调整小部件的方法. 注意: ConstraintLayout 作为支持库提供,您可以在API级别9(G ...

  3. nexus 搭建maven私服

    1. nexus 下载地址 https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.4-03-bundle.tar.g ...

  4. hash_set和hash_map

    1.hash_set集合容器 hash_set利用链式哈希表,进行数据的插入.删除和搜索.与set容器同样,不同意插入反复键值的元素.SGIC++哈希表是一个链式的结构,由表头和一系列单链组成.表头是 ...

  5. BZOJ 1507 NOI2003 Editor Splay

    题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...

  6. 用for和while循环求e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

    /*编敲代码,依据下面公式求e的值. 要求用两种方法计算: 1)for循环.计算前50项 2)while循环,直至最后一项的值小于10-4 e=1+1/1!+1/2!+1/3!+1/4!+1/5!+. ...

  7. sql简单的语句

    选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delet ...

  8. 19.Node.js EventEmitter

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里 ...

  9. 73.fseek与宽字符读取文件

    fseek //文件路径 ] = "1.txt"; //FILE *pf = fopen(path, "a+");//尾部添加,文件指针在尾部 //FILE * ...

  10. Linux下PortSentry的配置

    Linux下PortSentry的配置       前年写过<IDS与IPS功能分析>一文,受到广大读者关注,现将近期有关IDS配置的文章和大家分享.    Internet上的服务器一般 ...