* 第2..n行: 每行為2個用空格隔開的整數a、b,為兩塊相鄰草地的編號
51 35 2
4 33 5
輸入說明:
farmer john的農場中有5塊草地:草地1和草地3相鄰,草地5和草地2、草地
4和草地3,草地3和草地5也是如此。更形象一些,草地間的位置關係大體如下:
(或是其他類似的形狀)
輸出
2輸出說明:
fj可以選擇在草地2和草地3,或是草地3和草地5上建通訊塔
1 #include2using
namespace
std;
3int n,head[1000001],tot,f[10001][3];4
//f[i][0] i被自己覆蓋5//
f[i][1] i被兒子覆蓋 6//
f[i][2] i被父親覆蓋7//
f[i][0]+=min(f[son][1],f[son][2],f[son][0]) 8//
f[i][1]=f[x][0]+sigma(min (f[son][0],f[son][1]) ) 9//
f[i][2]+=min(f[son][0],f[son][1])
10struct
data e[1000001
];13
void add(int x,int
y) 18
void dp(int x,int
fa)
31 f[x][1]=f[special_son][0
];32
for(int i=head[x];i;i=e[i].nxt)38}
39int
main()
46 f[0][0]=0x3f
;47 dp(1,-1
);48 printf("
%d\n
",f[1][1]1][0]?f[1][1]:f[1][0
]);49
return0;
50 }
Usaco2008 Jan 電話網路
一道比較神的樹形dp,恕我太菜,一開始想的是三維的。實際上並不需要三維,只需要用0,1,2表示即可 d p u 0 dp u 0 dp u 0 表示當前點不放,他的某乙個兒子覆蓋他的代價 d p u 1 dp u 1 dp u 1 表示當前點放,他的子樹也被覆蓋的代價 d p u 2 dp u 2 ...
1596 Usaco2008 Jan 電話網路
farmer john決定為他的所有奶牛都配備手機,以此鼓勵她們互相交流。不過,為此fj必須在奶牛們居住的n 1 n 10,000 塊草地中選一些建上無線電通訊塔,來保證任意兩塊草地間都存在手機訊號。所有的n塊草地按1.n 順次編號。所有草地中只有n 1對是相鄰的,不過對任意兩塊草地a和b 1 a ...
1596 Usaco2008 Jan 電話網路
farmer john決定為他的所有奶牛都配備手機,以此鼓勵她們互相交流。不過,為此fj必須在奶牛們居住的n 1 n 10,000 塊草地中選一些建上無線電通訊塔,來保證任意兩塊草地間都存在手機訊號。所有的n塊草地按1.n 順次編號。所有草地中只有n 1對是相鄰的,不過對任意兩塊草地a和b 1 a ...