思路:
假如有答案,一定是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; }