提交时间:2024-02-23 14:55:26
运行 ID: 26711
#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; }int n,m,dep; set<int>v[maxn],g[maxn]; vector<pi>opt; map<pi,int>EG; set<int>LF; bool chk(){ up(i,1,n)for(int x:v[i])if(!EG.count(m_p(i,x)))return 0; return 1; } int w(){ int ct=0; up(i,1,n)for(int x:v[i])if(!EG.count(m_p(i,x)))ct++; return ct/2; } void dfs(int d){ if(w()+d-1>dep)return; if(d>dep){ if(chk()){ printf("Yes\n%d\n",dep); for(auto it:opt)printf("%d %d\n",it.p1,it.p2); exit(0); }return; } set<int>tmp=LF; for(int x:tmp){ int u=(*v[x].begin()); v[u].erase(x),v[x].erase(u); if(v[u].size()==1)LF.insert(u); for(int y:g[x]){ if(y==u)continue; if(v[y].size()==1)LF.erase(y); v[x].insert(y),v[y].insert(x); opt.p_b(m_p(x,y)); dfs(d+1); opt.pop_back(); v[x].erase(y),v[y].erase(x); if(v[y].size()==1)LF.insert(y); }if(v[u].size()==1)LF.erase(u); v[u].insert(x),v[x].insert(u); } } void slv(){ n=read(),m=read(); up(i,1,m){ int x=read(),y=read(); g[x].insert(y),g[y].insert(x); int o1=read(),o2=read(); if(o1)v[x].insert(y),v[y].insert(x); if(o2)EG[m_p(x,y)]=EG[m_p(y,x)]=1; } up(i,1,n)if(v[i].size()==1)LF.insert(i); while(1)dfs(1),dep++; }int main(){ // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }