呃呃呃。。。真的是慘烈啊。。。
今天的模擬賽是真的慘。。。。。
本題,正解居然是搜尋!!!!!!
蒟蒻自己歪歪了乙個貌似是正解但是卻連一半都沒過的錯解。
先解釋一下自己的dp思路把。
$f[i][u][v][0/1]$表示第i秒(等效於深度)uv之間的邊斷還是不斷。
轉移有兩個:
$f[dep[u]][u][v][1]=size[v];$表示此邊斷,然後下面的點全對答案有貢獻
然後找到v的兒子
$f[dep[u]][u][v][0]=max(f[dep[u]][u][v][0],max(f[dep[v]][u][j][0],f[dep[v]][u][j][1]));$
臨收卷前發現貌似第二維可以壓掉,也就是:$f[dep[v]][v][0/1]$表示v上面那個邊要不要刪。
然後發現隨手hack....
於是,我發現答案統計的時候,會有驚人的重複計算。
於是,我歪歪了好久,怎麼標記統計過了,怎麼返回,怎麼....
然後....發現最後好像被我打成了貪心???
我在每一層去最大值,然後標記,返回,從別的子樹裡找最大值,然後一直重複到底層。
於是...我抱著能a掉這題的心情,笑了起來。。。
然後我rand了好多的的資料,都沒有hack掉,我更開心了。
(先放dp**:)
#include#define g(x) for(int i=head[x];i;i=e[i].next)view code#define l(x) for(int l=head[x];l;i=e[l].next)
using
namespace
std;
const
int maxn=505
;int
n,p;
struct
edge
e[maxn];
inthead[maxn],cnt;
void addedge(int
from,int
to);
head[
from]=cnt;
}int
dep[maxn];
intsize[maxn];
intfa[maxn];
void dfs(int u,intf)}
int f[maxn][maxn][2
];int
mp;void dp(intu)}
intans;
intvis[maxn];
void getans(int
u)
for(int i=head[u];i;i=e[i].next)
else
}}
intmain()
addedge(
0,1);
dfs(
1,0);
dp(1);
for(int i=1;i<=n;i++)
mp=max(mp,dep[i]);
getans(1);
printf("%d
",n-ans);
return0;
}
dp錯在於:它會漏狀態,也就是說:
我的dp是從子樹開始更新,然鵝,即使我在答案統計上避免了重複,它也從乙個dp變成了乙個貪心,也就是說,它貌似是等效於每次在一層之內找乙個子樹最大的點加上,這個貪心是錯的。
從而得出:dp都是錯的。
因為它總會漏狀態,如果從兒子更新,同深度的狀態沒法記錄,如果從孫子更新,它的曾孫子沒法更新。總而言之就是沒法更新完全,也就是有後效性。
所以,如果想得出正解,就得從最下開始更新子樹,而這點dp是沒法做到的,所以,能夠猜到正解是什麼:
暴力
怎麼暴力怎麼寫,直接更新,不需要記錄狀態。
這個複雜度簡直玄學。。。
如果是分叉很多,這個dfs能被卡成皮皮,但是這題的資料貌似非常水....
所以,暴力的思路就是:
記錄每個深度的所有點,然後對於這些同深度的點進行更新,找出最大值,一次一次向上更新,一直到根節點。
感覺這個深搜巨tm像廣搜啊....但是....好吧我錯了
**:
#include usingnamespace
std;
const
int maxn = 505
;int
n, p;
vector
g[maxn], dep[maxn];
intvis[maxn];
intans, s;
void dfs(int u, intd)}
int work(int u, int
t)
return
ss;}
void getans(intd)}
intmain()
dfs(
1, 1
); getans(2);
printf("%d
", n -ans);
return0;
}
P1041 傳染病控制
題目背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。...
P1041 傳染病控制(dfs)
近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 wh...
洛谷P1041 傳染病控制
近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 wh...