JZOJ5857 【NOIP提高組模擬A組2018.9.8】沒有上司的舞會

題目

Description

“那么真的有果爾德施坦因這樣一個人?”他問道。
“是啊,有這樣一個人,他還活著。至于在哪里,我就不知道了。”
“那么那個密謀——那個組織?這是真的嗎?不是秘密警察的捏造吧?”
“不是,這是真的。我們管它叫兄弟會。除了它確實存在,你們是它的會員以外,你們 就別想知道別的了。”
他知道的是,這種思想一定會一代一代地傳下去,他們一定能夠在沒有黑暗的地方再會。
他不知道的是,兄弟會已經走到了崩潰的邊緣;思想警察早已無孔不入;那沒有黑暗的地方, 是友愛部,是 101 室……
兄弟會的頭目之一,愛麥虞埃爾?果爾德施坦因,正在謀劃著一場無力的反抗。這抗爭的內容,竟是一場宏大的舞會。(這作為小資情調、腐朽沒落的代表,以及未經允許的群眾運動, 是大洋國嚴格禁止的(甚至是 crimethink))這也是為了加強組織的團結,并且為那終將到來的最后一戰而激勵、鼓舞士氣。
眾所周知,兄弟會為了避免思想警察的追捕,保密措施相當嚴密。會內一位高級干部奧勃良如此說:“從你們切身經驗來說,你們永遠連十來個會員也不認識。”(注意:測試數據可能不符合這句話)具體來說,每個人只認識他的全部上司。一個人的上司要么是他的直接上司
(在輸入中會向你給出,并且可能不止一人),要么是這個人的某個上司的直接上司。為了增進同志之間的感情,同時為了防止滲入兄弟會的間諜破獲整個組織的組成與結構,果爾德 施坦因想要確保在舞會中任意兩個人都互不相識。
真理部的外圍黨員溫斯頓在奧勃良的介紹下加入了兄弟會。他剛剛知道了這個激動人心的舞 會,仿佛又感受到了那若有若無的、來自舊時代的溫暖。因為參與舞會的人越多,他與他親愛的裘莉亞就越有可能重逢,所以他很好奇最多能有多少人參與。

Input

第一行兩個正整數 N,M,表示兄弟會的會員人數以及關系數。然后 M 行,每行 2 個正整數 x,y(1<=x,y<=N,x≠y),表示 x 是 y 的直接上司(即 y 是 x 的直接下屬)。

Output

輸出一行一個整數,表示參加舞會的最多人數。

Sample Input

4 4
1 2
2 4
1 3
3 4

Sample Output

2

Data Constraint

對于 5%數據,滿足 n<=5。
對于 20%數據,滿足 n<=20。
對于另 10%數據,滿足會員構成一棵外向樹,即:除了一號會員(即果爾德施坦因本人)之外的每個會員,恰好只有一個上司,且一號會員沒有上司。
對于另 10%數據,滿足會員構成一顆內向樹,即:除了一號會員(即溫斯頓)之外的每個會員,恰好只有一個直接下屬,且一號會員沒有下屬。
對于另 30%數據,滿足每個會員要么沒有上司,要么沒有下屬。
對于 100%數據,滿足 n<=200,關系不會重復出現,且不會自相矛盾(即 A 既是 B 的上司也是 B 的下屬)。換句話說,關系構成了一張無重邊的有向無環圖。保證圖聯通。


做法

顯然,這是一個有向無環圖。
對于每一條有向邊(u,v)(u,v),表示vvuu的的上司。
題目要讓我們在圖上找到盡量多的點,使得這些點不能互相到達。
咋做?
題解上這樣說:

在有向無環圖中,我們定義:
鏈:圖上一些點的集合,對于鏈上任意兩個點 x、y,滿足 x 能到達 y 或者 y
能到達 x。
反鏈:圖上一些點的的集合,對于反鏈上任意兩個點 x、y,滿足 x 不能到達
y 并且 y 不能到達 x。
所以就是很顯然的求最長反鏈長度了~
有以下 Dilworth 定理:
最長反鏈長度=最小鏈覆蓋(選取最少的鏈覆蓋所有的點)

這是題解上話,然后我上網找這條定理的證明,結果……證明很少,并且好幾篇博客是一個樣子,而且讓我一臉懵逼,甚至感覺那證明還是錯的……
于是,只能感性理解。
假設用一些鏈來覆蓋整張圖。
對于每個反鏈上的點,它們各自在一條鏈上。
如果這些鏈的數量大于最小鏈覆蓋,那么多出來的那些都是廢的,會出現兩個反鏈上的點能連通,與題目不符……
好吧,感性理解這種東西是不方便用語言來說的。
現在假設我們已經知道了這個定理。
接下來可以用二分圖匹配來解決:
將每個點拆成左右兩邊(實現時不需要)。
對于一條邊(u,v)(u,v),就在二分圖上uleftuleftvrightvright連一條有向邊。
跑一遍二分圖匹配,那么答案就是n?n?最大匹配數
Why?
在二分圖,連一條邊,可以視為將兩條鏈合并,也就是將最小鏈覆蓋數?1?1
拆成二分圖,避免路徑相交的問題。


代碼

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 200
int n,m;
bool to[MAXN+1][MAXN+1];//表示是否連通
int be[MAXN*2+1];
bool vis[MAXN+1];
bool matching(int);
int main(){freopen("dance.in","r",stdin);freopen("dance.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1;i<=m;++i){int u,v;scanf("%d%d",&u,&v);to[v][u]=1;}//要用Floyed來處理處連通性for (int k=1;k<=n;++k)for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)to[i][j]|=to[i][k]&&to[k][j]; int max_matching=0;for (int i=1;i<=n;++i){memset(vis,0,sizeof vis);if (matching(i))max_matching++;}printf("%d\n",n-max_matching);return 0;
}
bool matching(int x){for (int i=1;i<=n;++i)if (to[x][i] && !vis[i]){vis[i]=1;if (!be[i] || matching(be[i])){be[i]=x;return 1;}}return 0;
}

總結

這題好打是好打,就是理解得迷迷糊糊的。
感性理解還是很重要的……

轉載于:https://www.cnblogs.com/jz-597/p/11145275.html

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

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

相關文章

python 中如何判斷list中是否包含某個元素

在python中可以通過in和not in關鍵字來判讀一個list中是否包含一個元素 theList [‘a’,’b’,’c’] if ‘a’ in theList: print ‘a in the list’ if ‘d’ not in theList: print ‘d is not in the list’

時間即財富:創業者浪費精力的八個錯誤

導讀&#xff1a;本文作者Jeff Miller是美食網頁應用Punchfork的創始人&#xff0c;同時也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投資人。作者通過對自己創業初期一些錯誤選擇進行盤點&#xff0c;告訴讀者在創業初期應該學會選擇&#xff0c;因為在創業初…

寫給大數據開發初學者的話3

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 如果你已經按照《寫給大數據開發初學者的話2》中第三章和第四章的流程認真完整的走了一遍&#xff0c;那么你應該已經具備以下技能和知識…

十五周二次課

18.6 負載均衡集群介紹 主流開源軟件LVS、keepalived、haproxy、nginx等其中LVS屬于4層&#xff08;網絡OSI 7層模型&#xff09;&#xff0c;nginx屬于7層&#xff0c;haproxy既可以認為是4層&#xff0c;也可以當做7層使用keepalived的負載均衡功能其實就是lvslvs這種4層的負…

LeetCode--171--Excel表列序號

問題描述&#xff1a; 給定一個Excel表格中的列名稱&#xff0c;返回其相應的列序號。 例如&#xff0c; A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1: 輸入: "A" 輸出: 1示例 2: 輸入: "AB" 輸出: 28示例 3: 輸入: "…

中國歷代王朝大排名

中國自秦以降&#xff0c;一共出過九個大王朝&#xff0c;它們是&#xff1a;秦、漢、晉、隋、唐、宋、元、明、清。另外&#xff0c;還出過五十幾個小王朝&#xff0c;它們是&#xff1a; 三國時的魏、蜀、吳&#xff0c;共三個&#xff1b; [ 轉自鐵血社區 http://bbs.tiexue…

寫給大數據開發初學者的話4

見&#xff1a;http://lxw1234.com/archives/2016/11/795.htm 如果你已經按照《寫給大數據開發初學者的話3》中第五章和第六章的流程認真完整的走了一遍&#xff0c;那么你應該已經具備以下技能和知識點&#xff1a; 為什么Spark比MapReduce快。使用SparkSQL代替Hive&#xff…

TPS及計算方法

TPS (transaction per second)代表每秒執行的事務數量&#xff0c;可基于測試周期內完成的事務數量計算得出。例如&#xff0c;用戶每分鐘執行6個事務&#xff0c;TPS為6 / 60s 0.10 TPS。同時我們會知道事務的響應時間(或節拍)&#xff0c;以此例&#xff0c;60秒完成6個事務…

域名解析服務之DNS查詢類型

在實際應用中DNS查詢主要分為兩種方式查詢&#xff1a;1.遞歸查詢&#xff1b;2.迭代查詢 一般情況下&#xff1a;為了減少資源的消耗&#xff0c;網絡中客戶端與所屬的本地DNS服務器查詢方式通常為遞歸查詢&#xff0c;本地DNS服務器與外部的公共DNS服務器間的查詢方式為迭代查…

MFC Ribbon界面設計

Ribbon是類似于office2007樣式的界面&#xff0c;它替代了傳統的MFC程序里的菜單和工具欄 MFC默認生成的Ribbon功能少&#xff0c;需要我們自己添加一些控件和圖片等元素使界面好看 看下面的一個界面&#xff0c;是VC2010示例里的 看到它與默認Ribbon樣式的區別&#xff1a; 工…

互聯網手機躁動:“周大炮”追逐“雷布斯”

摘要&#xff1a;周鴻祎選擇非自有品牌補貼&#xff0c;可能是看到了小米初期的艱難&#xff0c;也想追求速度&#xff0c;繞開自制手機終端環節。于小米而言&#xff0c;需要解決后續機型承接、持續穩定提升產能&#xff1b;對360而言&#xff0c;需要投入巨量補貼資金&#x…

獲取泛型T的ClassT clazz

在我們搭建框架中往往會用到泛型,我們知道泛型的好處是在編譯的時候檢查類型安全&#xff0c;并且所有的強制轉換都是自動和隱式的&#xff0c;代碼的重用率高 然而有時候<method>的入參并不能直接強制轉換成泛型的類型,比如說下面這段代碼&#xff1a; 很明顯String 類…

寫給大數據開發初學者的話5

見&#xff1a;http://lxw1234.com/archives/2017/01/832.htm 至此&#xff0c;你的大數據平臺底層架構已經成型了&#xff0c;其中包括了數據采集、數據存儲與計算&#xff08;離線和實時&#xff09;、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提…

3.spring boot Controller獲取請求參數的值

2019獨角獸企業重金招聘Python工程師標準>>> 1.獲取連接中的參數,使用倒的關鍵詞PathVariable RestController public class HelloController {RequestMapping(value "/hello/{id}",method RequestMethod.GET)public String index(PathVariable("i…

斷開的管道 java.io.IOException: Broken pipe 解決方法

斷開的管道 java.io.IOException: Broken pipe 解決方法一、Broken pipe產生原因分析1.當訪問某個服務突然服務器掛了&#xff0c;就會產生Broken pipe;2.客戶端讀取超時關閉了連接&#xff0c;這時服務器往客戶端再寫數據就發生了broken pipe異常&#xff01;二、方案1.問題一…

登錄與注冊

代碼如下 private void btn_login_Click(object sender, EventArgs e){SqlConnection sqlconnection new SqlConnection();sqlconnection.ConnectionString ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;SqlCommand sqlcommand new SqlComman…

四大電商對壘價格戰:家電高庫存或是推手

摘要&#xff1a;[京東、蘇寧、國美、天貓等電商在家電領域的價格戰&#xff0c;更多是定價方家電廠商的倒逼]  “五一”期間&#xff0c;電商企業發起的價格戰硝煙仍未消散&#xff0c;如今戰火又起。一種較為普遍的看法是&#xff0c;此次價格戰&#xff0c;正是各家電商企…

三分鐘明白 Activiti工作流 -- java運用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、 什么是工作流 以請假為例&#xff0c;現在大多數公司的請假流程是這樣的 員工打電話&#xff08;或網聊&#xff09;向上級提出請…

linux命令 ps -ef 的含義

PS是LINUX下最常用的也是非常強大的進程查看命令//以下這條命令是檢查java 進程是否存在. ps -ef |grep java下面對命令選項進行說明&#xff1a;-e 顯示所有進程。-f 全格式。ps -e 列出程序時&#xff0c;顯示每個程序所使用的環境變量。ps -f 用ASCII字符顯示 樹狀結構 &…

vue-i18n使用及踩坑記錄

使用步驟 1. 安裝 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from vue import VueI18n from vue-i18n Vue.use(VueI18n)//2. 定義messages const messages {en: {text: {hello: hello world}},zh: {text: {hello: 你好、世界}} }//如果messages字段很多…