1. 程式人生 > >ACM PKU POJ 1112 解題報告

ACM PKU POJ 1112 解題報告

問題描述:給定 n (1 < n < 101) 個人,以及資訊某個人 i 是否認識 j (1<=i<=n, 1<=j<=n, i != j),你的任務是把這 n 個人分成大小近可能相近的兩隊,使得 1)每個人屬於且只屬於某一隊;2)每個隊的大小至少為 1;3)每個隊的成員都相互認識。詳見:http://acm.pku.edu.cn/JudgeOnline/problem?id=1112

這題不難,但題目不錯。最直接的思路是:首先建立一個朋友網路,頂點是每一個人,如果兩個人相互認識,則連一條邊。然後在這個圖上求兩個大小相近的完全子圖。如果做不到,則問題無解。這個思路的難點在於,一下子想不出已知的簡單的演算法來未兩個大小相近的完全子圖。至少,本人想不到現成的~

直接的反面就是間接。與其求朋友網路,不如求 “敵人” 網路:如果兩個人之間不是相互認識,則連一條邊。這樣,每條邊的兩個結點就不可能被安排到同一個組。於是,問題就變成了一個二部圖問題。首先,判定是不是二部圖,這個容易,廣度優先和深度優先都能做到;其次,如果是二部圖,把二部圖的兩個部分求出來,這個也很直觀了,在判定是否為二部圖可以順便做到。

直到現在為止,我們討論的只是單一連通圖的情況。這種情況下,無所謂大小相近:如果有解,解是惟一的。實際的情況是,這個“敵人” 網路可能包含有多個連通子圖。如果每個連通子圖都是二部圖,則有解。這時,就需要在每個連通子圖中選擇合適的一方來加入某個隊,從而使得兩個隊的大小相近。這時,動態規劃就派上用場了。

令 cc[1..k] 表示 k 個連線子圖,cc[i][blue|red] 表示二部圖 cc[i] 中的紅方和藍方。假定最優解的兩個隊的為數為 max 和 min,max >= min。則人數之差 d = max - min = n - 2*min。d 最小,則 min 最大,且不超 n/2。考慮這樣的揹包問題:有 k 種物品,每種物品有藍色和紅色各一個,物品的價值 value 和重量 weight 相同,用product[i][blue | red] 表示。現在有一揹包大小為 n/2,要選 n 種不同的物品(在不同的顏色之間選一種)裝進揹包裡,並使其價值最大。顯然,這只是經典0/1 揹包問題的一個變種。經典問題為 “選或不選”,現在問題為 “選藍色還是紅色”。把每個二部圖的藍方和紅色看成一物品,其價值和其重量為其結點個數,則求最大 min 變成了求解上述揹包問題。

至此,問題得解。總結一下整理思路:

1)通過輸入建立朋友網路圖

2)通過朋友網路圖求 “敵人” 網路圖

3)用 BFS 或 DFS 求解連通分支,並算出每個分支的藍方和紅方,同時判斷問題是否可解

4)把每個分支的每一方當種物品,求解上述的揹包問題

這題不難,但卻用到了二部圖、求連通分支以及經典揹包問題變種等知識和技巧,而且還不是直接就可以看出應該如此求解,還得先進行一步轉換(即把朋友網路轉成 “敵人” 網路),確實是好題。當然,動態規劃部分不一定得套用揹包問題,例如,可以考慮狀態 f(i, d) ,前 i 個分支中,是否存在一種分組方式,使得兩隊人數之差為 d(可正可負)。於是,問題的解為使得 f(k, d)=true 的絕對值最小的那一個d。這個思路也很直觀。不過,個人喜歡把未知問題轉換成已知問題來求解的思路。

相關推薦

ACM PKU POJ 1112 解題報告

問題描述:給定 n (1 < n < 101) 個人,以及資訊某個人 i 是否認識 j (1<=i<=n, 1<=j<=n, i != j),你的任務是把這 n 個人分成大小近可能相近的兩隊,使得 1)每個人屬於且只屬於某一隊;2)每個隊的

ACM PKU POJ 1740 解題報告 -- 男人八題之四

題意:小明和小紅參加一種新的取石子游戲。遊戲開始時有 n 堆石子,參與遊戲的兩個選手輪流取走和移動石子,遊戲從小明開始。在每一輪中,選手選擇一個至少有一顆石子的堆,從該堆石子中拿走至少一個石子。接著,該選手可以多次地從該堆中剩下的石子中把任意多的個石子移動到任意的堆中。當然

有向圖的匯點 -- 兼 ACM PKU POJ 2186 ( Popular Cows ) 解題報告

題意:奶牛的夢想是成為牛群中最受歡迎的奶牛,即受其它所有牛的歡迎。“歡迎”是具有傳遞性,即如果牛A認為牛B受歡迎,牛B覺得牛C受歡迎,則牛A也隱含地認為牛C受歡迎。現在,給一組點對 (A,B) 表示 A 認為 B 受歡迎,找出有多少最受歡迎的奶牛。 這是一個有向圖上的問題

2016-2017 ACM-ICPC CHINA-Final 解題報告

題目連結 A. Number Theory Problem 題意:給你一個數N,求形如2k-1且小於2N的數中有多少能被7整除。 解法:觀察二進位制位找規律,答案是N/3。 #include<bits/stdc++.h> using namespace std; ty

杭電acm公選課作業解題報告——第三章 貪心演算法。

課堂筆記: 在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解(是否是全域性最優,需要證明)。很多貪心型別的題目都不是最樸素的貪心,而是需要做一些變化,對於我們,關鍵是找到貪心的本質! 求解基本步驟:

POJ 1401 解題報告

這道題是求N!的結果後面連續的0有多少個,實際上10 = 2 x 5,而2的個數又大於5,所以相當於求N!的5的質因數個數有多少個。n/5 + n/25 + n/125 + ...即可。 我確信小學奧數的時候學過。每感於小學奧數學過這麼多,後面這麼多年幹啥去了。 注意fiv

杭電ACM hdu 2152 Fruit 解題報告(母函式)

Problem Description 轉眼到了收穫的季節,由於有TT的專業指導,Lele獲得了大豐收。特別是水果,Lele一共種了N種水果,有蘋果,梨子,香蕉,西瓜……不但味道好吃,樣子更是好看。 於是,很多人們慕名而來,找Lele買水果。 甚至連大名鼎鼎的HDU ACM

POJ 1154 解題報告

這道題是普通的DFS,不需要優化就可以通過。 1154 Accepted 164K 32MS C++ 1326B /* ID: thestor1 LANG: C++ TASK: poj1154 */ #include <iostream> #inclu

POJ 1661 解題報告

這道題可以看做是DP也可以看成模擬。從上往下看每個平臺能否到達,是否遮擋,是否到地。程式碼寫得重複很多,應該可以簡潔許多。 需要注意的地方是這裡把出發點也看做了一個平臺,這樣按照平臺高度排序的時候需要排N+1個(而不是N個)。 1661 Accepted 180K 0MS

poj 1014 解題報告

題目描述:, 一群珠子,分別有價值為1,2,3,4,5,6,每個珠子的個數進行輸入為n1 n2 n3 n4 n5 n6,判斷能否分成兩堆價值相等的珠子。 解法分析: 本題我採用的是多重揹包策略。當價值m%2=1時,不可分,否者揹包容量為m/2時的最大容量,最後判斷w[m]=

POJ 1363 解題報告

這道題不難但是題目很難理解。看了測試樣例才明白,如果入棧順序是遞增的:1,2,3,4,5. 那麼給出一個出棧順序,比如5,4,1,2,3,判斷這個出棧順序是否可能。 我這裡就是按照題意模擬的。比如碰到5,就將小於等於5的都入棧(1,2,3,4,5),然是將5出棧(判斷這時棧

A Bug‘s life POJ 2492 解題報告 (種類並查集)

   這也算是種類並查集的一道經典例題了吧,題意就不多解釋了,先寫一些我對種類並查集的一些理解。    種類並查集比普通的並查集多一個relation陣列,relation[i] 記錄了 i 和 其直接父親節點的關係,這個關係的表示因題目而異,種類並查集的重點和難點就是

POJ 2243解題報告

BFS #include <stdio.h> #include <memory.h> #include <stdlib.h> const int maxn=15; int visit[maxn*maxn]; int dir[8][2]={

POJ 1308 解題報告

這道題我用的是並查集(union-find)確定沒有環,再看看邊數是不是節點數減一(確定是否聯通)做的。 AC後看了discuss,發現並不能通過2 1 3 1 0 0 這種資料(但是OJ上沒有這樣的資料)。看來還是需要檢查每個節點的入度,保證一個節點入度為0,其餘節點入度

[ACM] hdoj1018 Big Number 解題報告

題目傳送門 題目大意 給出一個整數n,n的範圍為1 < n < 10^7,計算n!的位數。 解題思路 計算n!的位數,及計算n!最高位是10的幾次冪,即計算log10(n!),根據

POJ 3278 解題報告

這道題是個BFS的問題,因為要求的是一個相鄰節點間距離都為1的graph中兩個節點間的最短距離。一開始上來用的DFS,結果可想而知。 3278 Accepted 844K 63MS G++ 1192B /* ID: thestor1 LANG: C++ TASK:

poj 2376解題報告(詳細) 帶幾組測試資料

farmer John要安排他的牛清理牛棚,一共有T個牛棚要清理,每頭牛可以清理相鄰的牛棚。比如,一頭牛可以清理4-7號牛棚。當然了,牛清理的牛棚可以重疊。現在要你求出可以完成牛棚的清理的最少頭牛的個數,不可以就輸出-1. 一道區間重疊問題。排序+貪心可解

POJ 2502 Subway ACM解題報告 (dijkstra求最短路)

第一次手搓dijkstra,以為是精度問題結果居然是模板寫錯(ps.我發四以後再不也寫錯) 首先這題是有不超過202個點(算上家和學校),距離化成時間來計算會比較方便哦。然後就是要用double型還來

pku acm 1005 解題報告

問題描述: I Think I Need a Houseboat Time Limit:1000MS  Memory Limit:10000KTotal Submit:16915 Accepted:5870 DescriptionFred Mapper is consi

ACM PKU 1844 解題報告

問題描述:Consider the natural numbers from 1 to N. By associating to each number a sign (+ or -) and calculating the value of this expression