【LA3415 訓練指南】保守的老師 【二分圖最大獨立集,最小割】

題意

? Frank是一個思想有些保守的高中老師。有一次,他需要帶一些學生出去旅行,但又怕其中一些學生在旅行中萌生愛意。為了降低這種事情發生的概率,他決定確保帶出去的任意兩個學生至少要滿足下面四條中的一條。

1.身高相差大于40厘米

2.性別相同

3.最喜歡的音樂屬于不同類型

4.最喜歡的體育比賽相同

你的任務是幫助Frank挑選盡量多的學生,使得任意兩個學生至少滿足上述條件中的一條。

分析

?這個模型叫二分圖的最大獨立集。既選擇盡量多的結點,使得任意兩個結點不相鄰(既任意一條邊的兩個端點不會被同時選中)。最大獨立集與最小覆蓋是互補的,因此答案就是結點總數減去最大匹配數。

?建模:將每個人看作一個結點,如果兩個人四個條件都不滿足,就意味著他們不能同時被選擇,連一條無向邊。這樣,問題就轉換為求這個圖的最大獨立集。因為他們每個人不是男生就是女生,所以這個圖是二分圖。

?按照慣例,我依然是用網絡流來做的最大匹配。原因依然是不會KM···等哪天(8012年)我學會來并且心情好可能會來補一下KM的代碼。

??

  1 #include <cstdio>
  2 #include <algorithm>
  3 #include <cstring>
  4 #include <iostream>
  5 #include <cmath>
  6 #include <queue>
  7 
  8 using namespace std;
  9 const int maxn=1000+10;
 10 const int maxm=2000000+100;
 11 
 12 const int INF=2147000000;
 13 struct Dinic{
 14     int head[maxn],Next[maxm],to[maxm],cap[maxm],flow[maxm];
 15     int sz,n,m,s,t;
 16     bool vis[maxn];
 17     int cur[maxn],d[maxn];
 18     void init(int n){
 19         this->n=n;
 20         memset(head,-1,sizeof(head));
 21         this->sz=-1;
 22     }
 23     void add_edge(int a,int b,int c){
 24         ++sz;
 25         to[sz]=b;
 26         cap[sz]=c;flow[sz]=0;
 27         Next[sz]=head[a];head[a]=sz;
 28         ++sz;
 29         to[sz]=a;
 30         cap[sz]=c;flow[sz]=c;
 31         Next[sz]=head[b];head[b]=sz;
 32     }
 33     bool BFS(){
 34         memset(vis,0,sizeof(vis));
 35         queue<int>Q;
 36         vis[s]=1;
 37         d[s]=0;
 38         Q.push(s);
 39         while(!Q.empty()){
 40             int u=Q.front();Q.pop();
 41             for(int i=head[u];i!=-1;i=Next[i]){
 42                 int v=to[i];
 43                 if(!vis[v]&&cap[i]>flow[i]){
 44                     vis[v]=1;
 45                     d[v]=d[u]+1;
 46                     Q.push(v);
 47                 }
 48             }
 49         }
 50         return vis[t];
 51    }
 52     int DFS(int x,int a){
 53         if(x==t||a==0)return a;
 54         int Flow=0,f;
 55         for(int& i=cur[x];i!=-1;i=Next[i]){
 56             int v=to[i];
 57             if(d[v]==d[x]+1&&(f=DFS(v,min(a,cap[i]-flow[i])))>0){
 58                 Flow+=f;
 59                 flow[i]+=f;
 60                 flow[i^1]-=f;
 61                 a-=f;
 62                 if(a==0)break;
 63             }
 64         }
 65         return Flow;
 66     }
 67     int Maxflow(int s,int t){
 68         this->s=s,this->t=t;
 69         int Flow=0;
 70         while(BFS()){
 71             for(int i=0;i<=n;i++)
 72              cur[i]=head[i];
 73 
 74             Flow+=DFS(s,INF);
 75         }
 76         return Flow;
 77     }
 78 }dinic;
 79 int T,n;
 80 int high[maxn];
 81 char sex[maxn];
 82 string mus[maxn],phy[maxn];
 83 int main(){
 84     scanf("%d",&T);
 85     for(int t=1;t<=T;t++){
 86         scanf("%d",&n);
 87         for(int i=1;i<=n;i++){
 88             scanf("%d %c",&high[i],&sex[i]);
 89             cin>>mus[i]>>phy[i];
 90         }
 91         dinic.init(n+2);
 92         for(int i=1;i<=n;i++){
 93             if(sex[i]=='M'){
 94                 for(int j=1;j<=n;j++){
 95                     if(sex[j]=='F'&&abs(high[i]-high[j])<=40&&mus[i]==mus[j]&&phy[i]!=phy[j]){
 96                             dinic.add_edge(i,j,1);
 97                     }
 98                 }
 99             }
100         }
101         for(int i=1;i<=n;i++){
102             if(sex[i]=='M')
103                 dinic.add_edge(0,i,1);
104         }
105         for(int i=1;i<=n;i++){
106             if(sex[i]=='F')
107                 dinic.add_edge(i,n+1,1);
108         }
109         int ans=dinic.Maxflow(0,n+1);
110         printf("%d\n",n-ans);
111     }
112 return 0;
113 }
View Code

?

?? 其實我覺得這道題不知道這個模型只是考慮最小割的話也能想。去除最少的學生使得剩下的所有學生之間任意兩個之間都滿足四個條件中的一條。我們在學生之間連的邊是這兩個學生間只能選一個或者都不選,那個割掉這條邊就代表去掉這兩個學生中的一個。所以可以求出最小割來以后,用總的人數n減掉最小割。

? 哇萬能的最小割我感覺這樣想比背什么模型好多了啊!

?

轉載于:https://www.cnblogs.com/LQLlulu/p/9307386.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

行車記錄儀穩定方案:TC358778XBG:RGB轉MIPI DSI芯片,M-Star標配IC

原廠&#xff1a;Toshiba型號&#xff1a;TC358778XBG功能&#xff1a;TC358778XBG是一顆將RGB信號轉換成MIPI DSI的芯片&#xff0c;最高分辨率支持到1920x1200&#xff0c;其應用圖如下&#xff1a;產品特征&#xff1a;MIPI接口&#xff1a;&#xff08;1&#xff09;、支持…

java.sql.SQLException: 無法轉換為內部表示之解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 這個錯是因為 數據庫中字段類型和程序中該字段類型不一致。 比如程序將某字段當做Integer類型&#xff0c; 而數據庫存儲又使用另外一…

網絡爬蟲--17.【BeautifuSoup4實戰】爬取騰訊社招

文章目錄一.要求二.代碼示例一.要求 以騰訊社招頁面來做演示&#xff1a;http://hr.tencent.com/position.php?&start10#a 使用BeautifuSoup4解析器&#xff0c;將招聘網頁上的職位名稱、職位類別、招聘人數、工作地點、發布時間&#xff0c;以及每個職位詳情的點擊鏈接…

public static void main(String[] args)的理解

public:權限修飾符&#xff0c;權限最大。static:隨著MianDemo類的加載而加載&#xff0c;消失而消失。void: 沒有返回值main: 函數名&#xff0c;jvm識別的特殊函數名(String[] args):定義了一個字符串數組參數。這個字符串數組是保存運行main函數時輸入的參數的

Miller-Rabin素數測試

Miller-Rabin素數測試 給出一個小于1e18的數&#xff0c;問它是否為質數&#xff1f;不超過50組詢問。hihocoder 我是真的菜&#xff0c;為了不誤導他人&#xff0c;本篇僅供個人使用。 首先&#xff0c;一個1e18的數&#xff0c;樸素\(O(\sqrt{n})\)素數判定肯定爆炸。怎么辦呢…

throws Exception的意思

在方法聲明部分使用&#xff0c;表示該方法可能產生此異常&#xff0c;如果在方法聲明處使用了throws聲明異常&#xff0c;則該方法產生異常也不必捕獲&#xff0c;會直接把異常拋出到調用該方法的地方。

java list按照元素對象的指定多個字段屬性進行排序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 直接提取重點代碼&#xff1a; /*** 把結果集合按時間字段排序&#xff0c;內部類重寫排序規則&#xff1a;* param list* return*/priv…

網絡爬蟲--18.python中的GIL(全局解釋器鎖)、多線程、多進程、并發、并行

參考文獻&#xff1a; python的GIL、多線程、多進程 并發和并行的區別&#xff1f; GIL(全局解釋器鎖)一看就懂的解釋&#xff01; 多謝作者分享&#xff01;

Socket和ServerSocket

對于即時類應用或者即時類的游戲&#xff0c;HTTP協議很多時候無法滿足于我們的需求。這會&#xff0c;Socket對于我們來說就非常實用了。下面是本次學習的筆記。主要分異常類型、交互原理、Socket、ServerSocket、多線程這幾個方面闡述。異常類型在了解Socket的內容之前&#…

徹底搞清楚Android中的 Attr

版權聲明&#xff1a;本文為sydMobile原創文章&#xff0c;轉載請務必注明出處&#xff01; https://blog.csdn.net/sydMobile/article/details/79978187 相信這個詞對于Android開發者來說十分熟悉了&#xff0c;那么你對他到底有多了解呢&#xff1f; 回憶起我剛開始接觸Andr…

D. Relatively Prime Graph

Lets call an undirected graph G(V,E)G(V,E) relatively prime if and only if for each edge (v,u)∈E(v,u)∈E GCD(v,u)1GCD(v,u)1 (the greatest common divisor of vv and uu is 11). If there is no edge between some pair of vertices vv and uu then the value of GC…

解決 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.tanj.mapper.SendDeta…

網絡爬蟲--19.【Scrapy-Redis實戰】分布式爬蟲爬取房天下--環境準備

文章目錄0. 思路一. 虛擬機Ubuntu0中安裝Redis二. 虛擬機Ubuntu1中安裝Redis三. Windows服務器上安裝Redis四. 安裝cmder五. 安裝RedisDesktopManager六. 修改Windows中的配置文件redis.windows.conf七. Ubuntu連接Windows上 的Redis服務器-----------------------------------…

開發人員,請愛護你的身體

最近一周身體極度不適&#xff0c;口腔潰瘍、嗓子痛、感冒咳嗽、發燒&#xff0c;統統來了一個遍&#xff0c;非常痛苦。所以最近一直關注有關于軟件開發人員的身體健康問題的網站、文章。 看了許多文章&#xff0c;在結合自己在這一周之內痛苦的感受&#xff0c;所以才寫這樣…

tkinter中scale拖拉改變值控件(十一)

scale拖拉改變值控件 使用戶通過拖拽改變值 簡單的實現&#xff1a; 1 import tkinter2 3 wuya tkinter.Tk() 4 wuya.title("wuya") 5 wuya.geometry("300x2001020") 6 7 8 # 創建對象 9 scale1 tkinter.Scale(wuya, from_0, to100) 10 scale1.pac…

vue+elementUI開發實踐問題總結

最近公司項目采用vue&#xff0c;實行前后端分離開發&#xff0c;采用element-ui框架&#xff0c;對于項目中遇到的問題進行記錄&#xff0c;便于日后查詢。 vueelementui怎樣點擊table中的單元格觸發事件&#xff1f;官方文檔是采用的cell-click方式。實際項目中需要在不同的t…

Socket的getInputStream()方法

Socket的getInputStream()方法可以獲得網絡連接輸入&#xff0c;同時返回一個InputStream實例 。

計算機圖形學理論(4):緩沖區

本系列根據國外一個圖形小哥的講解為本&#xff0c;整合互聯網的一些資料&#xff0c;結合自己的一些理解。 什么是緩沖區&#xff1f; 緩沖區是保存某些數據的臨時存儲空間。 為什么我們需要緩沖區&#xff1f;原因很簡單&#xff0c;當數據量很大時&#xff0c;因為計算機無…

解決:Every derived table must have its own alias

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias 解決&…

網絡爬蟲--20.【Scrapy-Redis實戰】分布式爬蟲獲取房天下--代碼實現

文章目錄一. 案例介紹二.創建項目三. settings.py配置四. 詳細代碼五. 部署1. windows環境下生成requirements.txt文件2. xshell連接ubuntu服務器并安裝依賴環境3. 修改部分代碼4. 上傳代碼至服務器并運行一. 案例介紹 爬取房天下&#xff08;https://www1.fang.com/&#xff…