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 }
  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/kickit/p/8809084.html
Copyright © 2011-2022 走看看