标签:stream clu 搜索 friends dfs pac 代码 turn ++
開始对点搜索,直接写乱了。想了想对边搜索,尽管复杂度高。剪枝一下水过去了。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; struct Edge{ int a,b; }G[35]; int n,m,deg[10],on[10],off[10]; int res; void init(){ memset(deg,0,sizeof(deg)); res = 0; } void dfs(int u){ //printf("%d\n",u); if(u == m){ res++; return; } int a,b; a = G[u].a;b = G[u].b; deg[a]--;deg[b]--; on[a]++;on[b]++; if((deg[a] && deg[b]) || (!deg[a] && deg[b] && on[a] == off[a]) || (!deg[b] && deg[a] && on[b] == off[b]) || (!deg[a] && !deg[b] && on[a] == off[a] && on[b] == off[b])) dfs(u+1); on[a]--;on[b]--; off[a]++;off[b]++; if((deg[a] && deg[b]) || (!deg[a] && deg[b] && on[a] == off[a]) || (!deg[b] && deg[a] && on[b] == off[b]) || (!deg[a] && !deg[b] && on[a] == off[a] && on[b] == off[b])) dfs(u+1); off[a]--;off[b]--; deg[a]++;deg[b]++; } int main(){ int cas; scanf("%d",&cas); while(cas--){ scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++){ scanf("%d%d",&G[i].a,&G[i].b); deg[G[i].a]++;deg[G[i].b]++; } dfs(0); printf("%d\n",res); } return 0; }
HDU 5305 Friends (搜索+剪枝) 2015多校联合第二场
标签:stream clu 搜索 friends dfs pac 代码 turn ++
原文地址:http://www.cnblogs.com/brucemengbm/p/6918649.html