眾所周知,我們可以通過直角座標系把平面上的任何乙個點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...