markdown不能用,我也是****。
题意:图上所有点都是由‘a’,.'b','c'组成,如果两个点是连通的,这两点点是相同的或者在字母表中连续,‘a’-'b','b'-'c'这种都是连通的例子。图上有n个点,现在给出一些连通关系,问是否可能存在这样的图,如果存在,输出任意一个图。
思路:根据条件,如果有一个点跟图上所有点都是连通的,我们就可以把这个点设为‘b’,因为‘b’-'a','b'-'b','b'-'c'都是连通的。首先我们把图上这种和所有点都连通的点去掉,剩下的图变成了几个块,块数不能超过两个,(想想就可以得到)而且每个块必须是强连通的,(也就是这个块中所有点都是两两相连的)。如果有两个块,一个块所有点设为‘a’,另一个块所有点设为‘c’。
http://codeforces.com/contest/623/problem/A
/*********************************************
Problem : AIM Tech Round#1 A
Author : NMfloat
InkTime (c) NM . All Rights Reserved .
********************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++) //遍历
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --) //反向遍历
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++) //遍历一个STL容器
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) //遍历u所连接的点
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
bool M[505][505];
bool vis[505];
int totnum ;
int ok ;//Yes or No
char ans[505];
void input() {
int u,v;
cls(M,0);
rep(i,1,m) {
scanf("%d %d",&u,&v);
M[u][v] = true; M[v][u] = true; //双向边
}
}
bool All_link(int u) {
int cnt = 0;
rep(i,1,n) {
cnt += M[u][i]; //代表和多少个点相连
}
if(cnt == totnum) {
ans[u] = 'b'; vis[u] = true;
rep(i,1,n) M[u][i] = M[i][u] = false;
totnum --;
}
}
void move_link(int u,char ch) {
int link_num = 0;
rep(i,1,n) link_num += M[u][i];
rep(i,1,n) {
if(M[u][i]) {
int tmp = 0;
rep(j,1,n) {
tmp += M[i][j];
M[i][j] = false;
}
if(tmp != link_num) { ok = 1; return ;}
vis[i] = true;
ans[i] = ch;
}
M[u][i] = false;
}
ans[u] = ch;
}
void find_group() {
int cnt = 0;
rep(i,1,n) {
if(!vis[i]) {
cnt ++;
if(cnt == 1)move_link(i,'a');//删除i所在这一个集合所有的边,并且判断是不是强连通的
else if(cnt == 2)move_link(i,'c');
else if(cnt == 3) ok = 1;
if(ok) return;
}
}
}
void solve() {
totnum = n - 1;
cls(vis,0);
rep(i,1,n) All_link(i);
//剩下的点不能多于两个集团。这一个集团必须是强连通的。
ok = 0;
find_group();
if(ok) puts("No");
else {
puts("Yes");
rep(i,1,n) putchar(ans[i]);
putchar('\n');
}
}
int main(void) {
// freopen("a.in","r",stdin);
while(~scanf("%d %d",&n,&m)) {
input();
solve();
}
return 0;
}