這是一道樹形dp的題。雖然我到死也沒想出來……
我們設出f[x][0..1]。f[x][0]表示當前以x為根的子樹全不放存檔點的代價。f[x][1]表示當前以x為根的子樹放了存檔點的代價。f[x][0]的轉移顯然,我們來想想怎麼轉移f[x][1]。以x為根的子樹若放了存檔點,有3種情況:
1、當前的x的直接兒子y,假如它也放了存檔點,那麼就有f[y][1]+deep[y],即重新從1走到y,存個檔後往下走。deep[y]表示從1走到y的代價。
2、當前的x的直接兒子y,假如它沒放了存檔點,而x放了存檔點,那麼就有f[y][0]+size[y]*value[t],即每次從x存檔點往下走到y,那麼x到y的邊則走了size[y]次。size[y]表示以y為根的子樹的葉子節點,value[t]表示x到y的邊權。
3、當前的x的直接兒子y,假設y之前的x的直接兒子都不放存檔點,而x放了存檔點,y也放了存檔點,那麼就有k+f[y][1]+value[t]。因為y之前的x的直接兒子都不放存檔點,而x,y放了存檔點,那麼直接從x往下走乙個格直接存檔就好了。k表示y之前的x的直接兒子的f[y』][0]的和。
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const ll maxn=1e6+5;
ll first[maxn],last[maxn],next[maxn],f[maxn][2],value[maxn],size[maxn],deep[maxn];
ll n,i,t,j,k,l,x,y,z,num;
void lian(ll x,ll y,ll z)
void dg(int x)
f[x][1]=min(f[x][0],f[x][1]);
}int main()
dg(1);
printf("%lld\n",f[1][1]);
}
AHOI2014 JSOI2014 支線劇情
傳送門 上下界網路流。以 1 號節點為源點 s 新建乙個匯點 t 如果 u 能到 v 那麼連邊 u to v 下界為 1 上界為 infty 費用為對應的所需時間,表示這段劇情至少看一次,且看一次代價為對應的所需時間。又因為我們可以在任何乙個節點重開一次,所以我們的每個節點 u 都連邊 u to t...
AHOI2014 JSOI2014 支線劇情
嘟嘟嘟 這是一道上下界費用流的模板題。源點就是1,匯點沒有,所以我們把每乙個點都連向匯點,因為可以在任意乙個點退出遊戲。上下界費用流的建圖方法和上下界網路流的建圖方法一樣。都是建立附加源匯。只不過每條邊多了個費用。有費用的邊就是他自己的費用,其他的 比如補償用的邊 的費用全是0。然後我們跑費用流,答...
3876 Ahoi2014 支線劇情
time limit 10 sec memory limit 256 mb submit 1750 solved 1061 submit status discuss 故事背景 宅男jyy非常喜歡玩rpg遊戲,比如仙劍,軒轅劍等等。不過jyy喜歡的並不是戰鬥場景,而是類似電視劇集一般的充滿恩怨情仇的...