zoukankan      html  css  js  c++  java
  • HNU13377:Book Club(DFS)

    Problem description

    Porto’s book club is buzzing with excitement for the annual book exchange event! Every year, members bring their favorite book and try to find another book they like that is owned by someone willing to trade with them.
    I have been to this book exchange before, and I definitely do not want to miss it this year, but I feel that the trading should be improved. In the past, pairs of members interested in each other’s books would simply trade: imagine that person A brought a book that person B liked and vice-versa, then A and B would exchange their books.
    I then realized that many members were left with the same book they walked-in with... If instead of looking for pairs I looked for triplets, I could find more valid exchanges! Imagine that member A only likes member B’s book, while B only likes C’s book and C likes A’s book. These 3 people could trade their books in a cycle and everyone would be happy!
    But why stop at triplets? Cycles could be bigger and bigger! Could you help me find if it is possible for everyone to go out with a new book?

    Be careful, because members will not give their book without receiving one they like in return.
    Given the members of the book club and the books they like, can we find cycles so that everyone receives a new book?


    Input

    The first line has two integers: N, the number of people, and M, the total number of “declarations of interest”. Each of the following M lines has two integers, A and B, indicating that member A likes the book that member B brought (0<=A,B < N). Numbers A and B will never be the same (a member never likes the book he brought). 2<=N<=10 000
    1<=M<=20 000 and M<=N^2-N.


    Output

    You should output YES if we can find a new book for every club member and NO if that is not possible.


    Sample Input
    9 9
    0 1
    1 2
    2 0
    3 4
    4 3
    5 6
    6 7
    7 8
    8 5
    Sample Output
    YES
    Problem Source
    HNU Contest 

    题意:

    有n个人,m种需求,给出m行,每行a,b代表a想要的书在b那里,问能不能通过交换的方法来满足每一个人的需求


    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <bitset>
    #include <algorithm>
    #include <climits>
    using namespace std;
    
    #define ls 2*i
    #define rs 2*i+1
    #define UP(i,x,y) for(i=x;i<=y;i++)
    #define DOWN(i,x,y) for(i=x;i>=y;i--)
    #define MEM(a,x) memset(a,x,sizeof(a))
    #define W(a) while(a)
    #define gcd(a,b) __gcd(a,b)
    #define LL long long
    #define N 20005
    #define INF 0x3f3f3f3f
    #define EXP 1e-8
    #define rank rank1
    const int mod = 1000000007;
    
    int n,m,vis[N],tem[N];
    vector<int> a[N];
    
    int dfs(int u)
    {
        for(int i=0; i<a[u].size(); i++)
        {
            int v = a[u][i];
            if(!vis[v])
            {
                vis[v]=1;
                if(tem[v]==-1||dfs(tem[v]))
                {
                    tem[v] = u;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        int i,j,k,x,y;
        while(~scanf("%d%d",&n,&m))
        {
            for(i = 0; i<=n; i++)
                a[i].clear();
            for(i = 0; i<m; i++)
            {
                scanf("%d%d",&x,&y);
                a[x].push_back(y);
            }
            MEM(tem,-1);
            for(i = 0; i<n; i++)
            {
                MEM(vis,0);
                dfs(i);
            }
            for(i = 0; i<n; i++)
            {
                if(tem[i]==-1)
                    break;
            }
            if(i==n)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
    
        return 0;
    }
    


  • 相关阅读:
    获得CCNA和CCNP及CCIE认证的必备条件和有效期绍
    Js6利用class创建类
    Js6利用class创建类
    权益证明机制 (PoS):权益决定验证权,谁更有钱谁发言
    关于共识机制的一些想法
    有向无环图 (DAG) 技术:超越区块链的分布式账本
    寻找一种易于理解的一致性算法(扩展版)
    如何使用python语言中的方法对列表进行增删改操作
    如何操作python语言中的元素并计算相应的属性
    如何操作python语言中的列表并获取对应的元素
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6924820.html
Copyright © 2011-2022 走看看