LuoguP1967 貨車運輸 LCA

2022-04-29 02:57:06 字數 2804 閱讀 7718

lca的倍增策略不僅可以維護最近公共祖先,還可以維護其他具有區間可維護性的資訊,例如本題中維護的最小限重。

本題調了好久,最後發現原因是陣列用混了。以後一定要記準各個陣列含義,千萬不要混啊。。。

1 #include2 #include3 #include4 #include5 #include6

7using

namespace

std;89

const

int maxn = 1e5+10,maxm = 5e5+10;10

11struct

edge

16}edges[maxm],e;

1718

struct node;

1920

intn,m,x,y,z,cnte,q;

21 vectorg[maxn];

2223

intread()

2930

intfa[maxn];

31int find(int

x)35

36void

kruscal());

44g[e.to].push_back((node));45}

46}47}

4849

int jump[maxn][20],wide[maxn][20

];50

intdep[maxn];

5152

void workdep(int rt,int

fa)61}62

63void

initall() 69}

7071

int ask(int x,int

y)80

if(dx !=dy)

84for(int i = 18;i >= 0;i--)if(jump[x][i] !=jump[y][i])

88//

cout << "ans::";

89return min(ans,min(wide[x][0],wide[y][0

]));90}

9192

intmain();

95 q =read();

96kruscal();

97 memset(wide,0x3f,sizeof

(wide));

98for(int i = 1;i <= n;i++)if(!dep[i])workdep(i,0

);99

//cout << "dep: ";for(int i = 1;i <= n;i++)cout << dep[i] << ' ';cout << endl;

100initall();

101102

/*for(int i = 0;i <= 18;i++)

106putchar('\n');

107for(int i = 0;i <= 18;i++)

111putchar('\n');

*/112

113while(q--)printf("

%d\n

",ask(read(),read()));

114return0;

115 }

除錯**

1 #include2 #include3 #include4 #include5 #include6

7using

namespace

std;89

const

int maxn = 1e5+10,maxm = 5e5+10;10

11struct

edge

16}edges[maxm],e;

1718

struct node;

1920

intn,m,x,y,z,cnte,q;

21 vectorg[maxn];

2223

intread()

2930

intfa[maxn];

31int find(int

x)35

36void

kruscal());

44g[e.to].push_back((node));45}

46}47}

4849

int jump[maxn][20],wide[maxn][20

];50

intdep[maxn];

5152

void workdep(int rt,int

fa)61}62

63void

initall() 69}

7071

int ask(int x,int

y)80

if(dx !=dy)

84for(int i = 18;i >= 0;i--)if(jump[x][i] !=jump[y][i])

88return min(ans,min(wide[x][0],wide[y][0

]));89}

9091

intmain();

94 q =read();

95kruscal();

96 memset(wide,0x3f,sizeof

(wide));

97for(int i = 1;i <= n;i++)if(!dep[i])workdep(i,0

);98

initall();

99while(q--)printf("

%d\n

",ask(read(),read()));

100return0;

101 }

final

luogu P1967 貨車運輸

題面傳送門 顯然不可以最長路。司機肯定喜歡走長的路徑,所以先把最大生成樹跑出來。然後再最大生成樹上跑倍增不就好了?實現 include include include define min a,b a b a b using namespace std int n,m,k,x,y,ans,flag ...

Luogu P1967 貨車運輸

現在開始正式填以前欠下的一些題解。就從這道經典的noip題開始講吧。我們仔細看題目,發現要求的是圖上兩點 u,v 之間的路徑上最小值的最大值。跑dp?圖上狀態太多了,單次要 o n 的複雜度,直接t飛。我們考慮一種經典方法 將圖轉化為一顆樹來做 由於樹保證聯通,而這裡要求最大化最小值,因此我們很容易...

luogu P1967 貨車運輸

a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 ...