P1041 傳染病控制(noip2003)(搜尋)

2022-06-03 21:00:09 字數 2613 閱讀 1706

呃呃呃。。。真的是慘烈啊。。。

今天的模擬賽是真的慘。。。。。

本題,正解居然是搜尋!!!!!!

蒟蒻自己歪歪了乙個貌似是正解但是卻連一半都沒過的錯解。

先解釋一下自己的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)

#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;

}

view code

dp錯在於:它會漏狀態,也就是說:

我的dp是從子樹開始更新,然鵝,即使我在答案統計上避免了重複,它也從乙個dp變成了乙個貪心,也就是說,它貌似是等效於每次在一層之內找乙個子樹最大的點加上,這個貪心是錯的。

從而得出:dp都是錯的。

因為它總會漏狀態,如果從兒子更新,同深度的狀態沒法記錄,如果從孫子更新,它的曾孫子沒法更新。總而言之就是沒法更新完全,也就是有後效性。

所以,如果想得出正解,就得從最下開始更新子樹,而這點dp是沒法做到的,所以,能夠猜到正解是什麼:

暴力

怎麼暴力怎麼寫,直接更新,不需要記錄狀態。

這個複雜度簡直玄學。。。

如果是分叉很多,這個dfs能被卡成皮皮,但是這題的資料貌似非常水....

所以,暴力的思路就是:

記錄每個深度的所有點,然後對於這些同深度的點進行更新,找出最大值,一次一次向上更新,一直到根節點。

感覺這個深搜巨tm像廣搜啊....但是....好吧我錯了

**:

#include using

namespace

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...