#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<vector> #include<queue> #include<map> using namespace std; struct node { int u,v; }e[310005]; map<pair<int,int>,int>f; long long pp[310005]; long long num[310005]; vector<int>g[310005]; vector<int>g2[310005]; int vis[310005]; int ans[310005]; int ans2[310005]; int vis2[310005]; int in[310005]; int n,m; int cnt; int fa[300005]; int fin(int x) { if(x==fa[x])return x; else return fa[x]=fin(fa[x]); } void un(int x,int y) { int xx=fin(x); int yy=fin(y); fa[xx]=yy; } int flag=0; int ok=0; void dfs(int u,int ff,int z) { ans2[u]=z; vis[u]=1; int l=g[u].size(); flag=0; for(int i=0;i<l;i++) { int v=g[u][i]; if(v!=ff)flag++; else continue; if(vis[v]==1) { ok=1; continue; } if(flag==2) { ok=1; return; } dfs(v,u,z+1); } } int main() { pp[0]=1; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)pp[i]=pp[i-1]*11LL; for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=n;i++) { g[i].clear(); g2[i].clear(); } for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); e[i].u=u; e[i].v=v; num[u]+=pp[v]; num[v]+=pp[u]; } for(int i=1;i<=m;i++) { int u=e[i].u; int v=e[i].v; if(num[u]-pp[v]==num[v]-pp[u])un(u,v); } for(int i=1;i<=m;i++) { int u=e[i].u; int v=e[i].v; u=fin(u); v=fin(v); if(u!=v && f[make_pair(min(u,v),max(u,v))]==0) { f[make_pair(min(u,v),max(u,v))]=1; g[u].push_back(v); g[v].push_back(u); in[u]++; in[v]++; } } int cnt=0; for(int i=1;i<=n;i++)if(fin(i)==i)ans[i]=++cnt; for(int i=1;i<=n;i++)ans[i]=ans[fin(i)]; ok=1; for(int i=1;i<=n;i++)if(in[i]<=1 && fin(i)==i) { ok=0; dfs(i,-1,1); break; } for(int i=1;i<=m;i++) { int u=e[i].u,v=e[i].v; u=fin(u); v=fin(v); if(abs(ans2[u]-ans2[v])>=2)ok=1; if(in[u]>=3 || in[v]>=3)ok=1; } if(ok)printf("NO\n"); else { printf("YES\n"); for(int i=1;i<=n;i++)printf("%d ",ans2[fin(i)]); } printf("\n"); return 0; }
|