zoukankan      html  css  js  c++  java
  • 信与信封问题(二分图完美匹配变式)

    信与信封问题

    题目描述:
    John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子Small John将这n封信都拿出了信封。不幸的是,Small John无法将拿出的信正确地装回信封中了。
    将Small John所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定Small John能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助Small John,尽可能多地将信正确地装回信封。
    输入描述:
    n文件的第一行是一个整数n(n≤100)。信和信封依次编号为1,2,…,n。
    n接下来的各行中每行有2个数i和j,表示第i封信肯定不是装在第j个信封中。文件最后一行是2个0,表示结束。
    输出描述:
    输出文件的各行中每行有2个数i和j,表示第i封信肯定是装在第j个信封中。请按信的编号i从小到大顺序输出。若不能确定正确装入信封的任何信件,则输出“none”。
    样例输入:
    3
    1 2
    1 3
    2 1
    0 0
    样例输出:
    1 1
    思路:
    开始时把边取反,读入的是1,就置成0,读入是0,就置成1,然后跑一边匈牙利算法,然后判断是不是完美匹配,不是就直接输出none;
    第二步每次删掉一条边,判断是不是完美匹配,不是就输出这个两个点
    第二步跑完之后没有发现有一个是可以输出的,就输出none

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=110;
    int n,ans,from[maxn],to[maxn],a[maxn][maxn],t[maxn][maxn];
    bool flag[maxn];
    bool find(int x)
    {
        for(int i=1;i<=n;i++)
        if(a[x][i]&&!flag[i])
        {
            flag[i]=1;
            if(!from[i]||find(from[i]))
            {
                from[i]=x;
                to[x]=i;
                return 1;
            }
        }
        return 0;
    }
    int main()
    {
        int x,y;
        scanf("%d",&n);
        while(scanf("%d%d",&x,&y)&&x)
        t[x][y]=1;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
          if(!t[i][j]) a[i][j]=1;
        for(int i=1;i<=n;i++)
        {
            memset(flag,0,sizeof(flag));
            if(find(i)) ans++;
        }
        if(ans!=n) {printf("none");return 0;}
        bool can=1;
        for(int i=1;i<=n;i++)
        {
            memset(flag,0,sizeof(flag));
            a[i][to[i]]=0;
            int get=to[i];
            to[i]=0;from[get]=0;
            if(!find(i))
            {
                printf("%d %d
    ",i,get);
                to[i]=get;
                from[get]=i;
                can=0;
            }
            a[i][get]=1;
        }
        if(can) printf("none");
        return 0;
    }
  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070884.html
Copyright © 2011-2022 走看看