zoukankan      html  css  js  c++  java
  • uvalive 3415 Guardian Of Decency

    题意:

    有一个老师想组织学生出去旅游,为了避免他们之间有情侣产生,他制定了一系列的条件,满足这些条件之一,那么这些人理论上就不会成为情侣:

    身高相差40cm;性别相同;喜欢的音乐风格不同;最喜欢的运动相同。

    给出若干个学生的身高,性别,喜欢的音乐风格和喜欢的运动,问最多有多少人可以出去。

    思路:

    对于两个人,如果以上所有条件都不满足,那么就在他们之间连边,说明他们不能同时去。

    问题就转化成了求一个二分图的最大独立集。(独立集是两两之间不存在边的点的集合,最大顾名思义)

    最大独立集 = 点数- 最小点覆盖  = 点数 – 最大匹配

    匈牙利算法,复杂度O(n^3)。

    代码:

      1 #include <stdio.h>
      2 #include <iostream>
      3 #include <string>
      4 #include <string.h>
      5 #include <vector>
      6 using namespace std;
      7 
      8 const int N = 505;
      9 
     10 vector<int> g[N];
     11 int link[N];
     12 bool vis[N];
     13 
     14 struct node
     15 {
     16     int hei;
     17     string sex,music,sport;
     18     
     19     node(int a,string b,string c,string d)
     20     {
     21         hei = a;
     22         sex = b;
     23         music = c;
     24         sport = d;
     25     }
     26 };
     27 
     28 vector<node> ns;
     29 
     30 bool dfs(int u)
     31 {
     32     for (int i = 0;i < g[u].size();i++)
     33     {
     34         int v = g[u][i];
     35         
     36         if (!vis[v])
     37         {
     38             vis[v] = 1;
     39             
     40             if (link[v] == -1 || dfs(link[v]))
     41             {
     42                 link[v] = u;
     43                 link[u] = v;
     44                 
     45                 return true;
     46             }
     47         }
     48     }    
     49     
     50     return false;
     51 }
     52 int solve(int n)
     53 {
     54     int cnt = 0;
     55     
     56     memset(link,-1,sizeof(link));
     57     
     58     for (int i = 0;i < n;i++)
     59     {
     60         if (link[i] == -1)
     61         {
     62             memset(vis,0,sizeof(vis));
     63             if (dfs(i)) cnt++;
     64         }
     65     }
     66     
     67     return cnt;
     68 }
     69 
     70 int mabs(int x)
     71 {
     72     return x >= 0 ? x : -x;
     73 }
     74 
     75 int main()
     76 {
     77     int t;
     78     
     79     scanf("%d",&t);
     80     
     81     while (t--)
     82     {
     83         int n;
     84         
     85         scanf("%d",&n);
     86         
     87         ns.clear();
     88         
     89         for (int i = 0;i < n;i++)
     90         {
     91             g[i].clear();
     92             int a;
     93             string b,c,d;
     94             
     95             cin >> a >> b >> c >> d;
     96             
     97             ns.push_back(node(a,b,c,d));
     98         }
     99         
    100         for (int i = 0;i < n;i++)
    101         {
    102             for (int j = i + 1;j < n;j++)
    103             {
    104                 bool f = 0;
    105                 
    106                 if (mabs(ns[i].hei - ns[j].hei) > 40) f = 1;
    107                 if (ns[i].sex == ns[j].sex) f = 1;
    108                 if (ns[i].music != ns[j].music) f = 1;
    109                 if (ns[i].sport == ns[j].sport) f = 1;
    110                 
    111                 if (!f)
    112                 {
    113                     g[i].push_back(j);
    114                     g[j].push_back(i);
    115                 }
    116             }
    117         }
    118         
    119         int ans = solve(n);
    120         
    121         printf("%d
    ",n - ans);
    122     }
    123     
    124     return 0;
    125 }
  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/kickit/p/8809084.html
Copyright © 2011-2022 走看看