题目大意:
有n个宇航员,按照年龄划分,年龄低于平均年龄的是年轻宇航员,而年龄大于等于平均年龄的是老练的宇航员。
现在要分配他们去A,B,C三个空间站,其中A站只有老练的宇航员才能去,而B站是只有年轻的才能去,C站都可以去。
有m对宇航员相互讨厌,不能让他们在同一个空间站工作。
输出每个宇航员应分配到哪个空间站,如果没有则输出No solution.
思路:
其实对于每个宇航员,只关心他去C,或不去C,这样建图后,就是一个2-sat。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef long long LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const LL mod=1000000007;
const int NN=100010;
const int MM=1000010;
/* ****************** */
struct G
{
int v,next;
}E[NN*4],E1[NN*4];
int p[NN*2],T;
int p1[NN*2],T1;
int a[NN];
//scc
int dfn[NN*2],low[NN*2],tsp;
int id[NN*2],id_cnt;
int sta[NN*2],sta_top;
bool insta[NN*2];
//toposrot(we will use zhe scc's sta[] )
int ind[NN*2],col[NN*2],opp[NN*2];
void add(int u,int v)
{
E[T].v=v;
E[T].next=p[u];
p[u]=T++;
}
void add1(int u,int v)
{
E1[T1].v=v;
E1[T1].next=p1[u];
p1[u]=T1++;
}
void scc(int u,int pre_edge)
{
int i,v;
dfn[u]=low[u]=++tsp;
sta[++sta_top]=u;
insta[u]=true;
for(i=p[u];i+1;i=E[i].next)
{
if((i^1)==pre_edge)continue;
v=E[i].v;
if(dfn[v]==0)
{
scc(v,i);
low[u]=min(low[u],low[v]);
}
else if(insta[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
id_cnt++;
for(;;)
{
v=sta[sta_top--];
id[v]=id_cnt;
insta[v]=false;
if(v==u)break;
}
}
}
bool Two_Sat(int n)
{
int i;
for(i=1;i<=n+n;i++)
{
dfn[i]=low[i]=0;
insta[i]=false;
}
tsp=sta_top=id_cnt=0;
for(i=1;i<=n+n;i++)
{
if(dfn[i]==0)
scc(i,-1);
}
for(i=1;i<=n;i++)if(id[i]==id[i+n])return false;
return true;
}
// zhe toposort's aim is coloring
void toposort(int n)
{
memset(p1,-1,sizeof(p1));
T1=0;
int i,j,head,tail,u,v;
for(i=1;i<=id_cnt;i++)
{
col[i]=-1;
ind[i]=0;
}
for(i=1;i<=n;i++)
{
opp[ id[i] ] = id[i+n];
opp[ id[i+n] ] = id[i];
}
for(i=1;i<=n+n;i++)
{
for(j=p[i];j+1;j=E[j].next)
{
u=id[i];
v=id[ E[j].v ];
if( u!=v )
{
add1( v , u );
ind[u]++;
}
}
}
// use css's sta[]
head=1;
tail=0;
for(i=1;i<=id_cnt;i++)
{
if(ind[i]==0)
{
sta[++tail]=i;
}
}
while(head<=tail)
{
u=sta[head++];
if(col[u]!=-1)continue;
col[u]=1;
col[opp[u]]=0;
for(i=p1[u];i+1;i=E1[i].next)
{
v=E1[i].v;
ind[v]--;
if(ind[v]==0)
{
sta[++tail]=v;
}
}
}
}
int main()
{
int n,m;
int sum,i,u,v;
bool fg1,fg2;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0)break;
memset(p,-1,sizeof(p));
T=0;
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
fg1=a[u]*n<sum;
fg2=a[v]*n<sum;
if(fg1==fg2)
{
add(u,v+n);
add(v,u+n);
add(u+n,v);
add(v+n,u);
}
else
{
add(u+n,v);
add(v+n,u);
}
}
if(Two_Sat(n))
{
toposort(n);
for(i=1;i<=n;i++)
{
if( col[ id[i] ] ==1 )
{
if(a[i]*n<sum)
puts("B");
else
puts("A");
}
else
puts("C");
}
}
else
{
puts("No solution.");
}
}
return 0;
}