題解 最優連通子集

2021-10-24 21:48:41 字數 1490 閱讀 9770

眾所周知,我們可以通過直角座標系把平面上的任何乙個點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 = (n >= 1),其中pi(1 <= i <= n)屬於w,我們把s稱為整點集。

定義 3 設s是乙個整點集,若點r, t屬於s,且存在乙個有限的點序列q1, q2, ?, qk滿足:

qi屬於s(1 <= i <= k);

q1 = r, qk = t;

qi~qi + 1(1 <= i <= k-1),即qi與qi + 1相鄰;

對於任何1 <= i < j <= k有qi ≠ **;

我們則稱點r與點t在整點集s上連通,把點序列q1, q2,…, qk稱為整點集s中連線點r與點t的一條道路。

定義4 若整點集v滿足:對於v中的任何兩個整點,v中有且僅有一條連線這兩點的道路,則v稱為單整點集。

定義5 對於平面上的每乙個整點,我們可以賦予它乙個整數,作為該點的權,於是我們把乙個整點集中所有點的權的總和稱為該整點集的權和。

我們希望對於給定的乙個單整點集v,求出乙個v的最優連通子集b,滿足:

b是v的子集

對於b中的任何兩個整點,在b中連通;

b是滿足條件(1)和(2)的所有整點集中權和最大的。 輸入

第1行是乙個整數n(2 <= n <= 1000),表示單整點集v中點的個數;

以下n行中,第i行(1 <= i <= n)有三個整數,xi, yi, ci依次表示第i個點的橫座標,縱座標和權。同一行相鄰兩數之間用乙個空格分隔。-10^6 <= xi, yi <= 10^6;-100 <= ci <= 100。

輸出僅乙個整數,表示所求最優連通集的權和

樣例輸入

50 0 -2

0 1 1

1 0 1

0 -1 1

-1 0 1輸出2

#include#include#include#includeusing namespace std;

struct edgeedge[2010];

struct pointpoint[1010];

int tot,tot1;

int head[1010];

bool vis[1010];

int ans=-1000010;

int n;

inline void add(int u,int v)

int dfs(int root)

}if(s>ans)ans=s;

return s;

}int main()}}

dfs(1);

printf("%d\n",ans);

return 0;

}

POJ 1192最優連通子集

最優連通子集 題目的描述太繁瑣了。其實意思簡單,就是給定若干個點,如果兩個點之間的曼哈頓距離小於1,就連邊。然後就構成一顆樹,然後每個點都 有乙個權值,然後選取若干個點,使得權值和最大,並且點與點之前都連通。簡單的樹形dp,dp i 表示以i點為根的子樹並且選取i點時的最大權值。方程就很好寫,dp ...

poj 1192 最優連通子集 (樹形dp)

設dp u 0 為以u為根的子樹,子集中沒有u的最大權值,dp u 1 則表示子集中有u。如果子集中沒有u,那麼u的所有兒子中只能選乙個。如果子集中有u,那麼u的所有兒子要麼不選,要麼必須在子集中。狀態轉移方程 dp u 0 max dp u 0 max dp v 0 dp v 1 dp u 1 m...

POJ 1192 最優連通子集 動態規劃

題意 簡單點說就是給定一棵樹,每個節點都有乙個權值,現在要求求出這棵樹的乙個聯通的一枝使其權值最大。解法 設sum i 為包含i節點在內的一枝的最大權值和,那麼sum i val i max 0,sum j 其中 i,j 之間存在邊。當sum j 為負數時,對父親節點的貢獻就為0了。如下 inclu...