1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include<cstdio> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;
const int maxm=1e4+5;
int n1,n2,m;
int tot,go[2*maxm],bh[2*maxm],next[2*maxm],f1[maxm]; void ins(int x,int y,int z) { go[++tot]=y; bh[tot]=z; next[tot]=f1[x]; f1[x]=tot; }
int fa[maxm]; int get(int x) {return (fa[x]==x) ?x :fa[x]=get(fa[x]) ;}
int bz[maxm],now,ans[maxm],clr[maxm]; int dfs(int ty,int k,int c) { if ((!ty && k>n1 || ty && k<=n1) && !bz[k]) {bz[k]=now; return k;}; bz[k]=now; for(int p=f1[k]; p; p=next[p]) if (bz[go[p]]!=now) { clr[k]=(clr[k]+c)%3; clr[go[p]]=(clr[go[p]]+c)%3; ans[bh[p]]=(ans[bh[p]]+c)%3; int re=dfs(ty,go[p],(c==1)?2:1); if (re!=-1) return re; clr[k]=(clr[k]-c+3)%3; clr[go[p]]=(clr[go[p]]-c+3)%3; ans[bh[p]]=(ans[bh[p]]-c+3)%3; } return -1; }
int main() { scanf("%d %d %d",&n1,&n2,&m); fo(i,1,n1+n2) fa[i]=i; fo(i,1,m) { int x,y; scanf("%d %d",&x,&y); ins(x,y+n1,i), ins(y+n1,x,i); fa[get(x)]=get(y+n1); } fo(i,n1+1,n1+n2) if (!bz[i]) { if (!f1[i]) continue; bz[i]=++now; int j=dfs(0,i,1); if (j==-1) { fo(k,n1+1,n1+n2) if (i!=k && get(k)==get(i)) {j=k; break;} if (j>-1) { now++; bz[i]=0; dfs(0,j,clr[j]); } else { for(int p=f1[i]; p; p=next[p]) { now++; bz[i]=0; j=dfs(1,go[p],1); break; } if (j==-1) {printf("No\n"); return 0;} } } } printf("Yes\n"); fo(i,1,m) printf("%d ",ans[i]); }
|