题目:
输入:
4 6
1 2
1 3
1 4
2 3
2 4
3 4
输出:
YES
BAAA
题解:
建异或方程组,每个点可以赋值0或1,如果一个点原来的度数是偶数,那么它领域的点的异或要是0;如果一个点原来的度数是奇数,那么它领域的点异或上它自己要是1。高斯消元。
详细的题解
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long ll;
int a[501][501],du[501],b[501];
int n,m;
void init(){
int x,y;
cin>>n>>m;
for (int i=1;i<=m;i++){
cin>>x>>y;
du[x]++; du[y]++;
a[x][y]=1; a[y][x]=1;
}
for (int i=1;i<=n;i++)
if (du[i]%2==1){
b[i]=1; a[i][i]=1;
} else b[i]=0;
}
void gsxy(){
for (int i=1;i<=n;i++){
int k=i;
for (int j=i+1;j<=n;j++)
if (a[j][i]) k=j;
for (int j=1;j<=n;j++){
int t=a[i][j];
a[i][j]=a[k][j];
a[k][j]=t;
}
int t=b[i]; b[i]=b[k]; b[k]=t;
for (int j=1;j<=n;j++){
if ((j==i)||(!a[j][i])) continue;
b[j]^=b[i];
for (int k=1;k<=n;k++)
a[j][k]^=a[i][k];
}
}
}
int main(){
init();
gsxy();
int bo=0;
for (int i=1;i<=n;i++)
if (b[i]) bo++;
if ((bo==n)||(!bo)){
cout<<"NO"<<endl;
return 0;
}
cout<<"YES"<<endl;
for (int i=1;i<=n;i++)
if (b[i]) cout<<"B";
else cout<<"A";
return 0;
}