hdu 5305 Friends(dfs)
2015-07-24 11:15
281 查看
题意:n个人m条边(n<=8),对于每个点所连的边有0,1两种权值,且对于每个点两种边的数量要相等,问该图有几种方式;
思路:记录连在每个点上的边数,每种边的数量恰为1/2的总边数;
枚举每一条边,该边有两种状态,dfs遍历每一种状态,每一个满足条件的图为一种方式,两种边数量相等为条件;
思路:记录连在每个点上的边数,每种边的数量恰为1/2的总边数;
枚举每一条边,该边有两种状态,dfs遍历每一种状态,每一个满足条件的图为一种方式,两种边数量相等为条件;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int T,n,m; int s[5050],t[5050]; int on[5050],off[5050]; int du[5050],ans,cnt; void dfs(int x) { if(x==m+1) { for(int i=1;i<=n;i++){ if(on[i]!=off[i]){ return; } } ans++;return; } if((on[s[x]]<du[s[x]]/2)&&(on[t[x]]<du[t[x]]/2)){ //能用除法不用乘法 on[s[x]]++,on[t[x]]++; dfs(x+1); on[s[x]]--,on[t[x]]--; } if((off[s[x]]<du[s[x]]/2)&&(off[t[x]]<du[t[x]]/2)){ off[s[x]]++,off[t[x]]++; dfs(x+1); off[s[x]]--,off[t[x]]--; } } int main() { int i,j,k; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(on,0,sizeof(on)); memset(off,0,sizeof(off)); memset(du,0,sizeof(du)); for(i=1;i<=m;i++){ scanf("%d%d",&s[i],&t[i]); du[s[i]]++;du[t[i]]++; } ans=0;cnt=1; dfs(1); printf("%d\n",ans); } return 0; }
相关文章推荐
- js 对象深复制,创建对象和继承
- 0421
- Leetcode Q1: Two Sum
- SQLite VACUUM/真空(sqlite 文件压缩)
- WebSocket使用教程 - 带完整实例
- 关于java按位操作运算
- 关于Oracle的内连接问题
- Shell-Scp自动输入密码
- ListView 和 Adapter 使用
- 微信二维码网页登录、支付宝手机二维码支付模式实现
- 结构体
- hdu 图论的题目(转)
- mySql处理百万级数据库常识
- hdu 2298 - Toxophily [二分]
- Linux数据管理——文件锁定
- 【实习项目记录】(三)调整网络图片固定宽高
- WindowsService(Windows服务)开发步骤附Demo 【转】
- angularJS常用指令
- centos7 安装伪分布式Hadoop
- CentOS6.3安装PowerVault MD Storage Manager