#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 200010
#define INF 0x3f3f3f3f
struct TwoSAT{
int n, c;
vector<int> G[N];
bool mark[N];
int S[N];
bool dfs(int x) {
if (mark[x ^ 1]) return false;
if (mark[x]) return true;
mark[x] = true;
S[c++] = x;
for (int i = 0; i < G[x].size(); i++)
if (!dfs(G[x][i])) return false;
return true;
}
void init(int n) {
this->n = n;
for (int i = 0; i < 2 * n; i++)
G[i].clear();
memset(mark, 0, sizeof(mark));
}
//x == xval or y == yval
//这里的值是x为真或者y为真,若想两条件不同时成立,可以传递进非x和非y,即x^1 y^1
void add_clause(int x, int xval, int y, int yval) {
x = x * 2 + xval;
y = y * 2 + yval;
G[x^1].push_back(y);
G[y^1].push_back(x);
}
bool solve() {
for (int i = 0; i < 2 * n; i += 2) {
if (!mark[i] && !mark[i + 1]) {
c = 0;
if (!dfs(i)) {
while (c > 0) mark[S[--c]] = false;
if (!dfs(i + 1)) return false;
}
}
}
return true;
}
};
TwoSAT solver;
int age[N], ave, n, m;
void solve()
{
if(!solver.solve())
printf("No solution.\n");
else
{
for(int i = 0; i < n; i++)
if(age[i] >= ave)
printf("%c\n", !solver.mark[i * 2] ? 'A' : 'C');
else
printf("%c\n", !solver.mark[i * 2] ? 'B' : 'C');
}
}
int main()
{
while(~scanf("%d%d", &n, &m) && n + m)
{
solver.init(n);
ave = 0;
for(int i = 0; i < n; i++) {
scanf("%d", age + i);
ave += age[i];
}
ave = (ave + n - 1) / n;
int u, v;
for(int i = 0; i < m; i++)
{
scanf("%d%d", &u, &v);
u--, v--;
if((age[u] >= ave && age[v] >= ave) || (age[u] < ave && age[v] < ave))
{
solver.add_clause(u, 1, v, 1);
solver.add_clause(u, 0, v, 0);
}
else
{
solver.add_clause(u, 1, v, 1);
}
}
solve();
}
return 0;
}
uvaLive 3713
最新推荐文章于 2018-10-12 17:08:48 发布