提交时间:2024-10-11 16:30:05

运行 ID: 33582

#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #define ing(v) int J=h[(v)],vv=edge[J].v;J;J=edge[J].nx,vv=edge[J].v int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=100010; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,a[MAXN],b[MAXN],dl[MAXN],vis[MAXN]; map<int,int>mp[MAXN]; int num[MAXN],p[MAXN],c[MAXN],cnt,inq[MAXN]; queue<pii>q; int chk(int x){ if(vis[x])return -1; if(mp[x].size()==1)return (*mp[x].begin()).first; return -1; } void dop(int u){ if(a[u]==-1)return; for(inx(u)){ mp[v][a[v]]--; if(!mp[v][a[v]])mp[v].erase(a[v]); } for(inx(u)){ int tmp=chk(v); if(tmp!=-1)q.push(mk(v,tmp)),vis[v]=1; } a[u]=-1; } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++){ b[i]=a[i]=read(); add_side(i,i); mp[i][a[i]]++; } for(int i=1;i<=m;i++){ int u=read(),v=read(); add_side(u,v); mp[u][a[v]]++; mp[v][a[u]]++; } for(int i=1;i<=n;i++){ int tmp=chk(i); if(tmp!=-1)q.push(mk(i,tmp)),vis[i]=1; } cnt=0; while(!q.empty()){ int u=q.front().fr,col=q.front().sc;q.pop(); p[++cnt]=u,c[cnt]=col; for(inx(u))dop(v); } for(int i=1;i<=n;i++)a[i]=0; for(int i=cnt;i;i--){ a[p[i]]=c[i]; for(inx(p[i])){ a[v]=c[i]; } } for(int i=1;i<=n;i++)if(a[i]!=b[i]){ printf("NO"); return; } printf("YES\n%lld\n",cnt); for(int i=cnt;i;i--){ printf("%lld %lld\n",p[i],c[i]); } } signed main(){ slv(); return 0; }