补题在全排列的地方卡了好久,原来是自己的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());
}
}