Codeforces Round #192 (Div. 1) C. Graph Reconstruction (随机化算法)

题目链接
题意:给你一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值