貪心 洛谷3942將軍令

2021-08-09 23:19:18 字數 1210 閱讀 3311

###貪心**好

如果某個點沒被控制,我們當然選擇在他的第k的祖先**建站,這也就是貪心的思路。

這個「某個點」我們肯定要從深度最大的點開始。

所以說,先bfs一遍,bfs完的佇列就是按深度從小到大排序的了,我們從最後開始往前面迴圈,

對於沒有被控制的點,++ans,找出他的第k個祖先,然後dfs他的第k個祖先,向所有連線的點擴散,擴散深度為k,標記擴散到的點被控制。

然後就沒有然後了。

#include #include #include #include #include #include #include #include #include #include #include #define rep(i,m,n) for(int i=m;i<=n;i++)

#define dop(i,m,n) for(int i=m;i>=n;i--)

#define lowbit(x) (x&(-x))

#define ll long long

#define inf 2147483647

#define open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);

#define close fclose(stdin);fclose(stdout);

using namespace std;

inline int read()

while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();

return s*w;

}inline void write(int x)

const int maxn = 100010 ;

int n , k , special , dis [ maxn ] , vis [ maxn ] , fa [ maxn ] , ans , que [ maxn ] ;

struct edge e [ maxn << 1 ] ;

int head [ maxn ] , num ;

void add ( int from , int to )

void bfs () }}

void dfs ( int u , int dep )

int main ()

} write ( ans ) ;

return 0 ;

}

P3942 將軍令 貪心

鏈結 不斷從深度最大的節點的k kk級父節點進行擴充套件 注意擴充套件時使用 dfs dfsdf s,因為 bfs bfsbf s 儲存上乙個經過的節點較麻煩 中有bfs bfsbf s 函式,僅供參考,由於回環往復地入隊,tle tletl e 不可避免,include define reg re...

P3942 將軍令 貪心

鏈結 不斷從深度最大的節點的k k級父節點進行擴充套件 注意擴充套件時使用 dfs dfs,因為 bfs bfs 儲存上乙個經過的節點較麻煩 中有bfs bfs 函式,僅供參考,由於回環往復地入隊,tle tle 不可避免,include define reg register intread wh...

題解 Luogu P3942 將軍令 貪心

f x 0 表示最近控制驛站的距離 f x 1 表示最遠不能控制的驛站距離 當f x 0 f x 1 k是說明能被控制,但沒有貢獻 當f x 1 k時,x必須被控制,這時已經到達能控制點的最遠距離,如果再向上,x就無法被控制 正確性 如果x可以向上移動,並且仍然能控制x移動前能控制的點,就把x向上移...