題意:乙個網路,選出一些點做伺服器,使滿足一些條件,求伺服器最少數量。條件是,每個計算機恰有一台伺服器相連。
分析:對於每個節點,都有3種狀態,1、他是伺服器 d(u,0),2、他不是伺服器,但是父親是的 d(u,1),如果他父親是伺服器,將影響他的接下來的決策。3、他不是伺服器,父親也不是伺服器 d(u,2);
那麼:
d(u,0) = sum};
d(u,1) = sum;
d(u,2) 子節點恰有一台是伺服器,可以利用 上面的求出, d(u,2) = min;
建樹時,可以以任一點為根。
#include usingview codenamespace
std;
#define maxn 10005
#define inf 0x3f3f3f3f
intn;
vector
g[maxn],vertices;
int p[maxn],d[maxn][3
];//
建樹void dfs(int u,int
fa)
}int
main()
vertices.clear();
dfs(
0,-1
); memset(d,
0,sizeof
(d));
for(int i=vertices.size()-1;i>=0;i--)
d[u][
2] =inf;
for(int j=0;j)
}printf(
"%d\n
",min(d[0][0],d[0][2
]));
scanf("%d
",&n);
}return0;
}
UVA 1218 完美的服務
樹上的動態規劃,仍然按照每個節點的情況分類 1.f u 0 表示u是伺服器,那麼每個子節點可以是也可以不是 2.f u 1 表示u不是伺服器,而u的父親是伺服器,則u的所有子節點都不是伺服器 3.f u 2 表示u和父親都不是伺服器,則u恰好有乙個兒子是伺服器 那麼可以得到以下轉移方程 v代表u的所...
UVa 1218 完美的服務
題意 有n臺機器形成樹狀結構。要求在其中一些機器上安裝伺服器,使得每台不是伺服器的計算機恰好和一台伺服器計算機相鄰。求伺服器的最少數量。思路 和紫書上前面的uva1220挺像的,不過這題是一棵無根樹,就把0當做根就行了,方法還是一樣的dfs。d u 0 u是伺服器,則每個子結點可以是伺服器也可以不是...
樹形DP(完美的服務,uva 1218)
inf不能弄太大,因為會不停地累加很多次,事實上加三次就爆了。inf一直習慣了用0x3f3f3f3f,這不好,特別是dp時狀態轉移需要累加的情況,應該弄得比可能的上界再大一點點就好了。或者你可以不停地判斷,讓值最高只能達到inf。include define maxn 10010 define in...