#include <stdio.h>
#define N 2005
int n, m, i, j, k, a, b;
int h[N], q[N], p[N], v[N], c[N], f[N][N];
struct AB{
    int a, b, n;
} d[N*2];
void cun(int a, int b){
    d[++k].a = a, d[k].b = b;
    d[k].n = h[a], h[a] = k;
}
void bfs(int *f, int a, int x){
    int b, i, j, k;
    f[a] = 1, q[1] = a;
    for(i=j=1; i<=j; i++){
        a = q[i];
        if(f[a]-1 < x) c[a] = 1;//距离太近,不能涂色
        for(k=h[a]; k; k=d[k].n){
            b = d[k].b;
            if(!f[b]){
                f[b] = f[a] + 1;
                q[++j] = b;
            }
        }
    }
}
int main(){
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &a, &b);
        cun(a, b);
        cun(b, a);
    }
    scanf("%d", &k);
    for(i=1; i<=k; i++){
        scanf("%d%d", &p[i], &v[i]);
        bfs(f[p[i]], p[i], v[i]);
    }//预处理任意两点距离,并标记不能涂色的点
    for(i=1; a=p[i]; i++){
        for(b=1; b<=n; b++){
            if(!c[b] && f[a][b]-1==v[i]) break;
        }//其他点涂色,必须有距离相等的
        if(b > n) break;
    }
    if(a == 0){
        printf("Yes\n");
        for(i=1; i<=n; i++){
            printf("%d", c[i]^1);//1不涂色,0涂色
        }
    }
    else printf("No\n");
    return 0;
}

作者 crxis

发表回复