1. 程式人生 > >最優連通子集的解法

最優連通子集的解法

關於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

第1行是一個整數N(2 <= N <= 1000),表示單整點集V中點的個數; 
以下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,