最優連通子集的解法
關於POJ1192,求最優連通子集。
下面是POJ的題目描述:
Description
眾所周知,我們可以通過直角座標系把平面上的任何一個點P用一個有序數對(x, y)來唯一表示,如果x, y都是整數,我們就把點P稱為整點,否則點P稱為非整點。我們把平面上所有整點構成的集合記為W。定義1 兩個整點P1(x1, y1), P2(x2, y2),若|x1-x2| + |y1-y2| = 1,則稱P1, P2相鄰,記作P1~P2,否則稱P1, P2不相鄰。
定義 2 設點集S是W的一個有限子集,即S = {P1, P2,..., Pn}(n >= 1),其中Pi(1 <= i <= n)屬於W,我們把S稱為整點集。
定義 3 設S是一個整點集,若點R, T屬於S,且存在一個有限的點序列Q1, Q2, ?, Qk滿足:
1. Qi屬於S(1 <= i <= k);
2. Q1 = R, Qk = T;
3. Qi~Qi + 1(1 <= i <= k-1),即Qi與Qi + 1相鄰;
4. 對於任何1 <= i < j <= k有Qi ≠ Qj;
我們則稱點R與點T在整點集S上連通,把點序列Q1, Q2,..., Qk稱為整點集S中連線點R與點T的一條道路。
定義4 若整點集V滿足:對於V中的任何兩個整點,V中有且僅有一條連線這兩點的道路,則V稱為單整點集。
定義5 對於平面上的每一個整點,我們可以賦予它一個整數,作為該點的權,於是我們把一個整點集中所有點的權的總和稱為該整點集的權和。
我們希望對於給定的一個單整點集V,求出一個V的最優連通子集B,滿足:
1. B是V的子集
2. 對於B中的任何兩個整點,在B中連通;
3. B是滿足條件(1)和(2)的所有整點集中權和最大的。
Input
以下N行中,第i行(1 <= i <= N)有三個整數,Xi, Yi, Ci依次表示第i個點的橫座標,縱座標和權。同一行相鄰兩數之間用一個空格分隔。-10^6 <= Xi, Yi <= 10^6;-100 <= Ci <= 100。
Output
僅一個整數,表示所求最優連通集的權和。Sample Input
5 0 0 -2 0 1 1 1 0 1 0 -1 1 -1 0 1
Sample Output
2
這位作者的程式碼,在這裡表示感謝,給了我啟發。
是一道不怎麼難的題目,但是仍然有一些難於思考的地方,我覺得是我的演算法的深度和廣度非常的不夠,數學的知識也很欠缺。正在抓緊讀演算法導論。。。。
public class SubSet { public static int x[]; public static int y[]; public static int r[]; public static int n; public static int ans=0; public static int BFS(int current,int parent) { int re=0,new_right; for(int i=0;i<n;i++) { if(parent!=i&&(Math.abs(x[i]-x[current])+Math.abs(y[i]-y[current]))==1) { new_right=BFS(i, current); if(new_right>0) re+=new_right; } } if(re+r[current]>ans) ans=re+r[current]; return re+r[current]; } public static void main(String...arg) { Scanner input=new Scanner(System.in); n=input.nextInt(); x=new int[n]; y=new int[n]; r=new int[n]; for(int i=0;i<n;i++) { x[i]=input.nextInt(); y[i]=input.nextInt(); r[i]=input.nextInt(); } BFS(0,-1); System.out.println(ans); } }
相關推薦
最優連通子集的解法
關於POJ1192,求最優連通子集。 下面是POJ的題目描述: Description 眾所周知,我們可以通過直角座標系把平面上的任何一個點P用一個有序數對(x, y)來唯一表示,如果x, y都是整數,我們就把點P稱為整點,否則點P稱為非整點。我們把平面上所有整點構成的
POJ-1192-最優連通子集
本來書上是放在最短路徑那章的,寫了半天發現很麻煩,一搜索才知道這個題應該用樹形DP做, 算是比較簡單的樹形DP題吧。 程式碼: #include<cstdio> #include<cstring> #include<iostream> #
poj 1192 最優連通子集 樹狀dp
最優連通子集 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2431 Accepted: 1294 Description 眾所周知,我們可以通過直角座標系把平面上的任何一個點P用一個有序數對
POJ1192最優連通子集(樹狀dp)
最優連通子集 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2140 Accepted: 1139 Description 眾所周知,我們可以通過直角座標系把平面上的任何一個點P用一個有序數對(
POJ 1192 最優連通子集(樹形DP)
最優連通子集 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3100 Accepted: 1666 Description 眾所周知,我們可以通過直角座標系把平面
leetcode35題:搜索插入位置(不是最優解法,僅供參考)
重復 mce 僅供參考 sea elf () 參考 lis 位置 給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。你可以假設數組中無重復元素。 示例 1:輸入: [1,3,5,6], 5輸出: 2示例
詳解leetcode146題【LRU (最近最少使用) 快取機制】(附js最優解法!)
leetcode 146. LRU (最近最少使用) 快取機制 題目描述 運用你所掌握的資料結構,設計和實現一個 LRU (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。 獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總
牛客網《劍指Offer》 程式設計 25.複雜連結串列的複製 (最優解法)
題目描述 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空) 解題思路 這次使用時間複雜度為O(n
bzoj 1093: [ZJOI2007]最大半連通子圖
sha 表示圖 sin back script 不同的 sam scrip 註意 Description 一個有向圖G=(V,E)稱為半連通的(Semi-Connected),如果滿足:?u,v∈V,滿足u→v或v→u,即對於圖中任意兩點u,v,存在一條u到v的有向路
String 經常用法最優算法實現總結 (二)
lean ... itl min empty turn system then 實現 1. String getOrderedString(boolean isDuplicated, String … str) 說明: Orders all characters in
[POJ 2728]Desert King(0-1分數規劃/最優比率生成樹)
eat ice finall nec clu bool ann channels try Description David the Great has just become the king of a desert country. To win the respec
Uva 10003 Cutting Sticks (類似於最優矩陣連乘的dp)
out min 分析 sin [] can 任務 cin algo 題意:有一根長度為L的木棍,和n個切割點的位置(按照從小到大排序),你的任務是在這些切割點的位置把棍子切成n+1份,使得總切割費用最小。每次切割的費用等於被切的木棍長度 思路:這道題與最優矩陣連乘的思想一樣
(筆記)斯坦福機器學習第七講--最優間隔分類器
滿足 優化 最終 clas 定義 mar 擴展 strong play 本講內容 1.Optional margin classifier(最優間隔分類器) 2.primal/dual optimization(原始優化問題和對偶優化問題)KKT conditions(KK
POJ 3621 Sightseeing Cows(最優比例環+SPFA檢測)
span fort exp ros 說明 6.0 lines choice stdio.h Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submission
P1073 最優貿易
相同 一種商品 ade bar article https 同城 最大 pre P1073 最優貿易 題目描述 C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個 城市之間最多只有一條道路直接相連。
267. [NOI1997] 最優乘車
names ios 可能 while include 他在 printf 數字 i+1 ★★ 輸入文件:bustravel.in 輸出文件:bustravel.out 簡單對比 時間限制:1 s 內存限制:128 MB H城是一個旅遊勝地,每年都有成千上萬的
【圖論】最優貿易
價格 highlight style 不同 相同 -s 存在 n) size [NOIP2009]最優貿易 描述 C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個城市之間最多只有一條道路直接相連。這 m 條道路中有一部分為單向
HDU 4587 TWO NODES(割兩個點的最大連通分支數)
target int 兩個 bsp printf pan sta ans acm http://acm.hdu.edu.cn/showproblem.php?pid=4587 題意: 給一圖,求割去兩個點後所能形成的最大連通分支數。 思路: 對於這種情況,第一
bzoj2539 丘比特的煩惱、黑書P333 (最優二分圖匹配)
def 等於 ostream while 感情 deb valentine 區分 匹配 丘比特的煩惱 題目描述 Description 隨著社會的不斷發展,人與人之間的感情越來越功利化。最近,愛神丘比特發現,愛情也已不再是完全純潔的了。這使得丘比特很是苦惱,
tyvj——P3524 最大半連通子圖
read str include 它的 必須 border 暴力 emp lose P3524 最大半連通子圖 時間: 3000ms / 空間: 165536KiB / Java類名: Main 描述 輸入格式 第一行包含兩個整數N,