zoukankan      html  css  js  c++  java
  • POJ-1469 COURSES---二分图最大匹配--匈牙利算法

    题目链接:

    https://vjudge.net/problem/POJ-1469

    题目大意:

    给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件:

    1.每个学生选择一个不同的课程

    2.每个课程都有不同的代表

    如果满足,就输出YES

    解题思路:

    二分图最大匹配。

    邻接矩阵map[i][j]表示j号学生喜欢i号课程,然后对课程进行寻找匹配,匹配成功则标记学生,之后统计匹配数目即可。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #include<vector>
     6 #include<queue>
     7 using namespace std;
     8 typedef pair<int, int> Pair ;
     9 typedef long long ll;
    10 const int INF = 0x3f3f3f3f;
    11 const int maxn = 300 + 10;
    12 int T, n, m, cases;
    13 vector<int>G[maxn];
    14 int cx[maxn], cy[maxn];
    15 bool vis[maxn];
    16 bool dfs(int u)
    17 {
    18     for(int i = 0; i < G[u].size(); i++)
    19     {
    20         int v = G[u][i];
    21         if(!vis[v])
    22         {
    23             vis[v]  =1;//加入增广路
    24             if(cy[v] == -1 || dfs(cy[v]))
    25             {
    26                 cx[u] = v;
    27                 cy[v] = u;
    28                 return 1;
    29             }
    30         }
    31     }
    32     return 0;
    33 }
    34 int maxmatch()
    35 {
    36     int ans = 0;
    37     memset(cx, -1, sizeof(cx));
    38     memset(cy, -1, sizeof(cy));
    39     for(int i = 1; i <= n; i++)
    40     {
    41         if(cx[i] == -1)
    42         {
    43             memset(vis, 0, sizeof(vis));
    44             ans += dfs(i);
    45         }
    46     }
    47     return ans;
    48 }
    49 int main()
    50 {
    51     cin >> T;
    52     while(T--)
    53     {
    54         scanf("%d%d", &n, &m);
    55         int x, t;
    56         for(int i = 1; i <= n; i++)
    57         {
    58             scanf("%d", &t);
    59             G[i].clear();
    60             for(int j = 0; j < t; j++)
    61             {
    62                 scanf("%d", &x);
    63                 G[i].push_back(x);
    64             }
    65         }
    66         if(maxmatch() == n)cout<<"YES"<<endl;
    67         else cout<<"NO"<<endl;
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    游戏 猜拳游戏
    python的变量 以及操作系统
    python的异常处理
    python 三元运算
    python random 的用法
    python基础
    Round #417 A. Sagheer and Crossroads(Div.2)
    Round #416 B. Vladik and Complicated Book(Div.2)
    Round #416 A. Vladik and Courtesy(Div.2)
    Educational Round 26 D. Round Subset
  • 原文地址:https://www.cnblogs.com/fzl194/p/8835482.html
Copyright © 2011-2022 走看看