题目链接
题意:给你一个n个点m个边的无向图,没有自环,没有重边,然后每个点度数小于等于2,。现在让你重构一个,但是之前有的边,不能再有了,还要满足以上要求。
解法:随机化 (第一次接触)每次随机的时候,检查时候合法。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define X first
#define Y second
#define cl(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> P;
const int maxn=1005;
const int inf=1<<27;
map<P,int> mp;
int main(){
int n,m;
srand(time(NULL));
scanf("%d%d",&n,&m);
vector<int> v;
for(int i=1;i<=n;i++){
v.pb(i);
}
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u>v)swap(u,v);
mp[P(u,v)]=1;
}
int tot=0;
while(true){
bool ok=true;
random_shuffle(v.begin(),v.end());
for(int i=0;i<m;i++){
int a=v[i],b=v[(i+1)%n];
if(a==b){
ok=false;break;
}
if(a>b)swap(a,b);
if(mp[P(a,b)]){
ok=false;break;
}
}
if(ok){
break;
}
tot++;
if(tot==100){
printf("-1");return 0;
}
}
for(int i=0;i<m;i++){
printf("%d %d\n",v[i],v[(i+1)%n]);
}
return 0;
}