提交时间:2024-01-02 15:08:04

运行 ID: 24537

#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=20010,Mod=1011451423,Nod=1540285339,base=433; struct Edge{int v,nx;}edge[MAXN<<7];int h[MAXN],CNT;void init(){memset(h,-1,sizeof(h));CNT=0;} void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,a[MAXN],q[MAXN],tot,vs[MAXN],bsm[MAXN],bsn[MAXN],tim; bool ans; struct Loop{ int x,y; }p[MAXN]; void dfs(int now,int lst,int tp){ tim++; if(vs[now]){ int x=0,y=0; for(int i=vs[now];i<tp;i++){ tim++; x+=bsm[q[i]]; x%=Mod; y+=bsn[q[i]]; y%=Nod; } int tmp=tp-vs[now]; if(!p[tmp].x&&!p[tmp].y){ p[tmp].x=x; p[tmp].y=y; } else{ if(p[tmp].x!=x||p[tmp].y!=y){ ans=1; return; } } return; } q[tp]=now;vs[now]=tp; for(int i=h[now];i!=-1;i=edge[i].nx){ if(edge[i].v!=lst)dfs(edge[i].v,now,tp+1); } vs[now]=0; } signed main(){ init(); scanf("%lld%lld",&n,&m); bsn[1]=bsm[1]=base; for(int i=2;i<=n;i++)bsn[i]=bsn[i-1]*base%Nod,bsm[i]=bsm[i-1]*base%Mod; for(int i=1;i<=m;i++){ int u,v; scanf("%lld%lld",&u,&v); add_side(u,v); } for(int i=1;i<=n;i++)dfs(i,-1,1); printf("%s",(ans)?"Yes":"No"); return 0; }