提交时间:2024-02-25 19:22:57
运行 ID: 26771
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=105; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')t=-1;ch=getchar(); }while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }set<int>g[maxn]; int n,m,fa[maxn],siz[maxn]; vector<pi>opt; struct Tree { set<int>g[maxn]; map<pi,int>mp; void clear(){ up(i,1,n)g[i].clear(); mp.clear(); }void bd(){ up(i,1,n)for(int x:g[i])mp[m_p(i,x)]=1; } }T1,T2; void init(){up(i,1,n)fa[i]=i,siz[i]=1;} int find(int x){ if(x==fa[x])return x; return fa[x]=find(fa[x]); } void mg(int x,int y){ x=find(x),y=find(y); if(x==y)return; fa[x]=y,siz[y]+=siz[x]; } set<int> get(Tree a,Tree b){ init(); map<pi,int>mp; up(i,1,n)for(int x:a.g[i])if(i<x)mp[m_p(i,x)]=1; up(i,1,n)for(int x:b.g[i])if(i<x&&mp.count(m_p(i,x)))mg(i,x); int mx=0; up(i,1,n)mx=max(mx,siz[find(i)]); int id=0; up(i,1,n)if(siz[find(i)]==mx)id=find(i); set<int>T;up(i,1,n)if(find(i)==id)T.insert(i); return T; } void calc(Tree a,Tree b){ auto it=get(a,b); if(it.size()==n)return; if(it.size()==n-1){ int id=0; up(i,1,n)if(!it.count(i))id=i; opt.p_b(m_p(id,(*b.g[id].begin()))); return; } int ex=0,ey=0,ex2=0,ey2=0; for(int y:it){ for(int x:g[y]){ if(it.count(x))continue; if((!ex)&&a.mp.count(m_p(x,y)))ex=x,ey=y; else if(b.mp.count(m_p(x,y)))ex2=x,ey2=y; } }assert(ex&&ex2); if(ex!=ex2){ Tree c;c.clear();init(); up(i,1,n)for(int x:g[i])if(it.count(i)&&it.count(x))c.g[i].insert(x),c.g[x].insert(i),mg(i,x); c.g[ex].insert(ey),c.g[ey].insert(ex),mg(ex,ey); c.g[ex2].insert(ey2),c.g[ey2].insert(ex2),mg(ex2,ey2); up(i,1,n)for(int x:g[i])if(find(i)!=find(x))mg(i,x),c.g[i].insert(x),c.g[x].insert(i); c.bd(); calc(a,c),calc(c,b); return; }int ex3=0,ey3=0; for(int y:it){ for(int x:g[y]){ if(it.count(x))continue; if(x!=ex)ex3=x,ey3=y; } }assert(ex3);Tree c,d; c.clear(),d.clear();init(); up(i,1,n)for(int x:g[i])if(it.count(i)&&it.count(x))c.g[i].insert(x),c.g[x].insert(i),mg(i,x); c.g[ex].insert(ey),c.g[ey].insert(ex),mg(ex,ey); c.g[ex3].insert(ey3),c.g[ey3].insert(ex3),mg(ex3,ey3); up(i,1,n)for(int x:g[i])if(find(i)!=find(x))mg(i,x),c.g[i].insert(x),c.g[x].insert(i); c.bd(); calc(a,c);init(); up(i,1,n)for(int x:g[i])if(it.count(i)&&it.count(x))d.g[i].insert(x),d.g[x].insert(i),mg(i,x); d.g[ex2].insert(ey2),d.g[ey2].insert(ex2),mg(ex2,ey2); d.g[ex3].insert(ey3),d.g[ey3].insert(ex3),mg(ex3,ey3); up(i,1,n)for(int x:g[i])if(find(i)!=find(x))mg(i,x),d.g[i].insert(x),d.g[x].insert(i); d.bd(); calc(c,d),calc(d,b); } void slv(){ n=read(),m=read(); up(i,1,m){ int x=read(),y=read(),op1=read(),op2=read(); assert(x!=y); g[x].insert(y),g[y].insert(x); if(op1)T1.g[x].insert(y),T1.g[y].insert(x); if(op2)T2.g[x].insert(y),T2.g[y].insert(x); }T1.bd(),T2.bd(); calc(T1,T2); printf("Yes\n%d\n",opt.size()); for(auto it:opt)printf("%d %d\n",it.p1,it.p2); }int main(){ // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }