bzoj
很明顯,從任意乙個有寶藏的點開始,每次走到相鄰的df
s dfs
的節點就行了。
證明?
類似把一棵樹上的關鍵點全部標記出來
顯然是要走乙個大環。
這樣沿著df
s dfs
序從左至右依次便利是最優的。
用乙個set
s et
維護一下就行了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define rg register
#define max 111111
inline
int read()
int n,m;
struct linee[max<<1];
int h[max],cnt=1;
inline
void add(int u,int v,ll w);h[u]=cnt++;}
int dfn[max],low[max],size[max],hson[max],top[max],dep[max],fa[max],tim;
ll dis[max];
void dfs1(int u,int ff)
}void dfs2(int u,int tp)
}int lca(int u,int v)
bool imp[max];
set p;
ll ans=0;
int main()
dfs1(1,0);dfs2(1,1);
set::iterator it,it1,it2;
while(m--)
else
imp[x]^=1;
if(p.size()<=1)
it=p.end();--it;
printf("%lld\n",ans+dis(low[*p.begin()],low[*it]));
}return
0;}
bzoj3991 尋寶遊戲
題目鏈結 題意 給出乙個n個節點的帶權樹,m次操作每次修改乙個關鍵點,求每次操作後,從其中任意乙個關鍵點出發走遍所有關鍵點再走回起點所需的最小花費。solution 假如沒有修改操作的話,就像乙個簡單的在虛樹上樹形dp,方程如下 f i sigma sigma。觀察一下dp的過程,就是不斷地從前面的...
BZOJ3991 尋寶遊戲
小b最近正在玩乙個尋寶遊戲,這個遊戲的地圖中有n個村莊和n 1條道路,並且任何兩個村莊之間有且僅有一條路徑可達。遊戲開始時,玩家可以任意選擇乙個村莊,瞬間轉移到這個村莊,然後可以任意在地圖的道路上行走,若走到某個村莊中有寶物,則視為找到該村莊內的寶物,直到找到所有寶物並返回到最初轉移到的村莊為止。小...
尋寶遊戲(bzoj 3991)
小b最近正在玩乙個尋寶遊戲,這個遊戲的地圖中有n個村莊和n 1條道路,並且任何兩個村莊之間有且僅有一條路徑可達。遊戲開始時,玩家可以任意選擇乙個村莊,瞬間轉移到這個村莊,然後可以任意在地圖的道路上行走,若走到某個村莊中有寶物,則視為找到該村莊內的寶物,直到找到所有寶物並返回到最初轉移到的村莊為止。小...