Problem Description

垃圾佬有n副手套。

不幸的是,垃圾佬把它们都弄乱了。幸运的是,垃圾佬现在有一些关于手套的信息,他希望从中尽可能多地推测出正确的手套配对信息。

假设n只左手的手套,编号为1,2,3...,n,且n只右手的手套也依次为1,2,3,...,n。

从垃圾佬现在的信息中,可以知道,第i只左手手套肯定不是跟第j只右手手套配对。

请帮助垃圾佬尽可能多地推测出正确的手套配对方案。

Input

输入第一行有两个整数n,m,表示垃圾佬有n副手套以及m对信息。

接来下的m行中,每行有两个数a和b,表示左手手套a肯定不是跟右手手套b配对。

数据保证合法。即不会出现有一只手套跟所有的手套都不配对的情况。

1<=n<=100

0<=m<=n*(n-1)/2

Output

输出有若干行。

每行两个整数a,b,表示左手手套a一定是跟右手手套b配对的。

请按左手手套的编号a从小到大输出。

若不能推测出任意一条正确的配对信息,则输出一行"sorry",不包含引号。

SampleInput
3 3
1 3
2 1
1 2
SampleOutput
1 1
这里我们用到了有点类似于求割点的方法,枚举求哪些是必要的

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
bool vis[N], mat[N][N];
int n, k;
int dfs(int i, int *pa){
    for(register int j=1; j<=n; ++j){
        if(mat[i][j]&&!vis[j]){
            vis[j]=1;
            if(pa[j]==-1||dfs(pa[j], pa)){
                pa[j]=i;
                return 1;
            }
        }
    }
    return 0;
}
int ans[N]={};
void work(int &Ans, int *pa){
    Ans=0;
    for(register int i=1; i<=n; ++i)
        pa[i]=-1;
    for(register int i=1; i<=n; ++i){
        memset(vis, 0, sizeof(vis));
        Ans+=dfs(i, pa);
    }
}
int main(){
    int pa2[N], pa1[N];
    int x, y, Ans, tmp;
    register int i, j, top=0;
    scanf("%d%d", &n, &k);
    for(i=1; i<=n; ++i)
        for(j=1; j<=n; ++j)
            mat[i][j]=1;
    for(i=1; i<=k; ++i){
        scanf("%d%d",&x,&y);
        mat[x][y]=0;
    }
    work(tmp, pa2);
    for(i=1; i<=n; ++i){//只枚举了最大匹配的那些边,优化了时间复杂度
        if(pa2[i]!=-1){
            mat[pa2[i]][i]=0;
            work(Ans, pa1);
            if(Ans!=tmp){
                ans[pa2[i]]=i;
                top++;
            }
            mat[pa2[i]][i]=1;
        }
    }
    if(!top){
        puts("sorry");
        return 0;
    }
    for(i=1; i<=n; ++i){
        if(ans[i]){
            printf("%d %d\n", i, ans[i]);
        }
    }
    return 0;
}

 

相关文章:

  • 2022-12-23
  • 2021-12-15
  • 2021-05-16
  • 2022-12-23
  • 2021-11-12
  • 2021-08-04
  • 2021-07-28
  • 2021-11-26
猜你喜欢
  • 2021-09-02
  • 2022-12-23
  • 2021-04-12
  • 2021-12-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案