牛客网多校训练 第一场 D TWO Graphs

补题在全排列的地方卡了好久,原来是自己的STL里面的函数不知道,积累一下

C++STL中全排列函数next_permutation的使用

思路:因为n最多为8个,所以全排列就可以,然后一个个验证是不是与图一里面同构

#include<bits/stdc++.h>
using namespace std;  
typedef long long ll;  
#define  Max  int(1e5+10)
struct edg
{
   int a,b;
};
int n,m1,m2,x,y;
int g[9][9],v[9];
int main()
{
	while(~scanf("%d%d%d",&n,&m1,&m2))
    {
    	vector<edg> v2;
    	memset(g,0,sizeof g);
	    v2.push_back(edg{0,0});
		for(int i=1;i<=n;i++)
		   v[i]=i;
    	for(int i=1;i<=m1;i++)
    	   {
    	   	  scanf("%d%d",&x,&y);
    	   	  g[x][y]=1;
    	   	  g[y][x]=1;
		   }
		   
		for(int i=1;i<=m2;i++)
    	   {
    	   	  scanf("%d%d",&x,&y);
    	   	  v2.push_back(edg{x,y});
		   }
		   
		   set<int> s;
		   
	    do
	    {
	        int num=0,temp=0;	
	    	for(int i=1;i<=m2;i++)
	    	   {
	    	   	int x=v[v2[i].a],y=v[v2[i].b];
	    	   	if(g[x][y])
	    	   	    {
	    	   	   	  num++;
	    	   	   	  temp=temp|(int)pow(2,i-1);
					}
	    	   	if(num==m1)
				   {
				   	s.insert(temp);
				   	break; 
				   }   
			   }
		}while(next_permutation(v+1,v+1+n));
		
	    printf("%d\n",s.size());		     
	}

} 

猜你喜欢

转载自blog.csdn.net/pinkair/article/details/81131429
今日推荐