HDU 5305 Friends DFS
来源:互联网 发布:伸张正义的视频 知乎 编辑:程序博客网 时间:2024/05/17 15:38
题目大意:给一个n(1≤n≤8)个顶点,m条边的无向图,要求给边进行黑白染色,使得对于每一个顶点,黑边数=白边数,求方案数。
一个很直接的想法是DFS,枚举边的颜色,然后检查答案,但是边数最多有28条,直接做是会超时的,需要做几个优化:
- 首先每个顶点如果有M条边,如果M-1条边的颜色确定了那么第M条边肯定也确定了。
- 如果存在度为奇数的点,那么显然答案是0的。
对于第一个优化,我们发现,如果枚举边不太好操作,所以我们枚举点比较方便。
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#define MAXN 9using namespace std;int n,m,ans;int de[MAXN],status[MAXN][MAXN];//de统计度数,status保存边的状态 vector<int>p[MAXN];//保存图 void dfs(int);void emurate(int,int,int,int);void emurate(int po,int l,int on,int off){ //po为点,l边,on为黑边数,off为白边数 if(l==de[po]){ if(on==off)dfs(po+1); //当黑白边个数相等时,继续枚举下一个点 return; }else if(status[po][p[po][l]]){ //如果该边已经被染色那么跳过枚举下一条边 if(status[po][p[po][l]]==1)emurate(po,l+1,on+1,off); else emurate(po,l+1,on,off+1); }else if(l==de[po]-1){ //最后一条边的情况直接推出 if(on<off)status[p[po][l]][po]=1,++on; else status[p[po][l]][po]=2,++off; if(on==off)dfs(po+1); status[p[po][l]][po]=0; return; }else { //枚举当前边是黑是白 status[p[po][l]][po]=1;//黑 emurate(po,l+1,on+1,off); status[p[po][l]][po]=2; emurate(po,l+1,on,off+1);//白 status[p[po][l]][po]=0; }} void dfs(int p){ if(p==n+1){ans++;return;} emurate(p,0,0,0);}int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); ans=0; memset(de,0,sizeof de); for(int i=1;i<=n;i++)p[i].clear(); for(int i=0,u,v;i<m;i++){ scanf("%d%d",&u,&v); ++de[u];++de[v]; p[u].push_back(v); p[v].push_back(u); } bool ha=true; for(int i=1;i<=n;i++) if(de[i]%2){ha=false;break;} //直接否定有奇数度的情况 if(m==0)printf("1\n"); else if((!ha))printf("0\n"); else{ dfs(1); printf("%d\n",ans); } } return 0;}
0 0
- HDU 5305 Friends (DFS)
- HDU 5305 Friends (DFS)
- hdu 5305 Friends (dfs)
- HDU 5305 Friends DFS
- hdu 5305 Friends dfs
- HDU 5305 Friends(DFS)
- HDU 5305 Friends(dfs)
- HDU 5305 Friends(dfs)
- *HDU 5305 - Friends (DFS + 剪枝)
- HDU 5305 Friends(dfs)
- hdu 5305 Friends(dfs)
- HDU 5305 Friends DFS+剪枝
- HDU 5305 Friends(DFS + 剪枝)
- HDU 5305 Friends(简单DFS)
- hdu(5305)——Friends(dfs)
- HDU 5305 Friends(2015多校第二场 dfs + 剪枝)
- 【HDU 5305】Friends 多校第二场(双向DFS)
- HDU 5301 Friends(DFS + 枚举)
- android 欢迎界面
- Leetcode: Delete Node in a Linked List
- 关于句柄
- Android有关SDK生成的jar包的加密与混淆
- java面试总结
- HDU 5305 Friends DFS
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
- UIButton 点击传递两个参数的实现
- DevExpress Universal Subscription v15.1.6发布[附下载]
- The depreciation accelerate the plywood export
- Cart分类树算法之原理篇
- ! [rejected] master -> master (non-fast-forward)(有推荐视频)
- 如何将ppt内容转换为pdf格式查看
- 《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?