标签:
题意:t组数据,每组一个n和m表示点数和边数,接下来m条边,每条边两种状态,求每个点邻接边的两种状态数目相同的排列方式有几种
分析:从第一个顶点开始往下深搜每条边,每条边两种状态,注意回朔。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 10; int n,m,ans; int ed[maxn][maxn],tp[maxn]; void dfs(int u,int v){ if(u>n) ans++; //边界条件,当以i=1到n的所有点为顶点都满足条件即计数 else if(v>n){ if(tp[u]!=0) return;//如果以i=1到n的点为顶点的任意一点不满足条件即跳过 else dfs(u+1,u+2); //否则执行下一个顶点 } else{ if(ed[u][v]){ for(int i=1;i<=2;i++){ //边权分两种情况1和-1,注意回朔 if(i==1){ tp[u]++; tp[v]++; dfs(u,v+1); tp[u]--; tp[v]--; } if(i==1){ tp[u]--; tp[v]--; dfs(u,v+1); tp[u]++; tp[v]++; } } } else dfs(u,v+1); } } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); memset(ed,0,sizeof(ed)); memset(tp,0,sizeof(tp)); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); ed[u][v]=ed[v][u]=1; } ans=0; dfs(1,2); //从以1为顶点开始 printf("%d\n",ans); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sin_xf/article/details/47101735