思路:
假如有答案,一定是n的约数,因为假如有答案一定得是一个对称图形.然后我们对移动n的约数进行判断即可.
1.所连边数相同.
2.该点到所有点的距离是一样的.
然后本题就做完了.还是比较难想的叭..
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
vector<int>g[N];
int a[N],b[N],n,m;
int dis(int u,int v)
{
if(v>u) swap(v,u);
return min(u-v,n-(u-v));
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;cin>>u>>v;
u--,v--;
g[u].push_back(v);
g[v].push_back(u);
}bool flag=false;
for(int i=1;i<n;i++)
{
if(flag) break;
if(n%i!=0) continue;
bool fl=true;
for(int j=0;j<n;j++)
{
int u=j,v=(j+i)%n;
if(g[u].size()!=g[v].size())
{
fl=false;break;
}
int num=g[u].size();
for(int k=0;k<num;k++)
{
a[k]=dis(u,g[u][k]);
b[k]=dis(v,g[v][k]);
}sort(a,a+num);sort(b,b+num);
for(int k=0;k<num;k++)
if(a[k]!=b[k]) fl=false;
}if(fl) flag=true;
}
if(flag) puts("Yes");
else puts("No");
return 0;
}
京公网安备 11010502036488号