国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【無碼專區(qū)1】簡單路徑的第二大邊權(quán)(啟發(fā)式合并+最小生成樹)

這篇具有很好參考價值的文章主要介紹了【無碼專區(qū)1】簡單路徑的第二大邊權(quán)(啟發(fā)式合并+最小生成樹)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

只有std,沒有自我實(shí)現(xiàn),所以叫做無碼專區(qū)

description

給一張無向圖,多次詢問,每次詢問兩個點(diǎn)之間所有簡單路徑(不重復(fù)經(jīng)過點(diǎn))中邊權(quán)第二大(不是嚴(yán)格第二大)的權(quán)值的最小值。

數(shù)據(jù)范圍: 1 0 5 10^5 105 級別

我的想法

50 % 50\% 50% 的數(shù)據(jù) q , n ≤ 1 0 3 , m ≤ 2 × 1 0 3 : q,n\le 10^3,m\le 2\times 10^3: q,n103,m2×103:

先做一次最小生成樹,求出任意兩點(diǎn)之間聯(lián)通的最小邊權(quán)(某條路徑的最大邊權(quán)值)。

每次詢問 ( u , v ) (u,v) (u,v) ,我直接枚舉中間轉(zhuǎn)折點(diǎn) i i i,強(qiáng)制這條路徑是 u → i → v u\rightarrow i\rightarrow v uiv。【 → \rightarrow 代指一條路徑】

第二大邊權(quán)就是 ( u , i ) (u,i) (u,i) 聯(lián)通路徑的最大值和 ( v , i ) (v,i) (v,i) 聯(lián)通路徑的最大值,二者中的較小值。

旁邊的 Oxide \text{Oxide} Oxide 巨佬認(rèn)為很有可能 u → i u\rightarrow i ui i → w i\rightarrow w iw 之間經(jīng)過了同樣的點(diǎn)。

i.e. u → x → i → x → v u\rightarrow x\rightarrow i \rightarrow x\rightarrow v uxixv

但后面再仔細(xì)一想,就算這是的答案會被 i i i 更新,但是后面一定會枚舉到 x x x,顯然 u → x → v u\rightarrow x\rightarrow v uxv 會比以前的路徑少了 ( x , i ) (x,i) (x,i) 一段。

路徑上的邊權(quán)最大值一定是不減的

所以多的 ( x , i ) (x,i) (x,i) 一段只可能使最大邊權(quán)增大 / 不變。

那么 x x x 的決策一定是不劣于 i i i 的決策的。

另有 20 % 20\% 20% 是樹:兩個點(diǎn)之間只有一條簡單路徑,可以直接倍增求路徑的第二大邊權(quán)值。

綜上,本題自我實(shí)現(xiàn)分值應(yīng)該在 7 0 ′ 70' 70

solution

類似最小生成樹的方法,從小到大加邊。

如果加完一條邊后, u , v u,v u,v 之間只差一條邊聯(lián)通,那么顯然這條邊就是第二小,也就是最終的答案。

考慮怎么維護(hù)?

設(shè) N ( u ) : N(u): N(u): u u u 有直接邊相連,但還沒有相連的點(diǎn)的集合【當(dāng)前枚舉邊的權(quán)值暫時小于等于這些點(diǎn)與 u u u 的權(quán)值,最小生成樹的寫法就還沒有加入這些邊】

或者理解為:還差一條邊就能聯(lián)通的點(diǎn)的集合

考慮啟發(fā)式合并,每次合并 u , v u,v u,v 各自所在的連通塊。

此時可能出現(xiàn): N ( u ) N(u) N(u) 中的點(diǎn) x x x v v v 相連【在 v v v 連通塊里面】 ,或, N ( v ) N(v) N(v) 中的點(diǎn) y y y u u u 相連【在 u u u 連通塊里面】

這個時候意味著,加上 u ? v u-v u?v 這條邊后,還差 u ? x u-x u?x v ? y v-y v?y 這一條邊就會使得 u , v u,v u,v 相連,所以 u ? v u-v u?v 這條邊權(quán)就是最后的答案。

如果直接枚舉 N ( u ) , N ( v ) N(u),N(v) N(u),N(v) 則不符合時間限制。

我們可以這么做:

  • 遍歷 N ( u ) N(u) N(u) 的所有點(diǎn),然后看是否在 v v v 的詢問中。

    i.e. 假設(shè) x ∈ N ( u ) , x ∈ q ( v ) x\in N(u),x\in q(v) xN(u),xq(v) x ? u x-u x?u 之間的邊還沒有加入。

    此時加入為 u ? v u-v u?v 的邊。一旦加入完, x → u → v x\rightarrow u\rightarrow v xuv就只差 x ? u x-u x?u 的一條邊。

    所以答案就是現(xiàn)在操作的 u ? v u-v u?v 邊的邊權(quán)。

    這樣就處理了掛在 v v v 上面的某些 通過 u u u 連通塊中某些點(diǎn)和邊解決 的詢問。

  • 遍歷 u u u 里面的所有詢問,判斷是否在 N ( v ) N(v) N(v) 中。

    i.e. 假設(shè) x ∈ q ( u ) x\in q(u) xq(u) , x ? v x-v x?v 之間的邊還沒有加入。

    此時加入為 u ? v u-v u?v 的邊。一旦加入完, x → v → u x\rightarrow v\rightarrow u xvu 就只差 x ? v x-v x?v 的一條邊。

    所以答案是 u ? v u-v u?v 現(xiàn)在這條邊的邊權(quán)。

    這樣就處理了掛在 u u u 上面的某些 通過 v v v 連通塊中某些點(diǎn)和邊解決 的詢問。

這么做會發(fā)現(xiàn),雖然是合并兩個聯(lián)通塊和處理兩個聯(lián)通塊各自掛著的詢問,但是枚舉的只有一個聯(lián)通塊的信息。

所以啟發(fā)式合并,就用 N ( u ) + q ( u ) N(u)+q(u) N(u)+q(u) N ( v ) + q ( v ) N(v)+q(v) N(v)+q(v) 大小比較,選較小的進(jìn)行枚舉。

時間復(fù)雜度 O ( n log ? n ) O(n\log n) O(nlogn)

合并具體而言:枚舉其中一個較小連通塊的信息,進(jìn)行答案處理。所有掛在 u , v u,v u,v 點(diǎn)的詢問和邊都重新掛在合并后新連通塊的根 w w w 上。

i.e. 詢問 u , x u,x u,x 的答案,合并后相當(dāng)于問 w , x w,x w,x 的答案,因?yàn)榉凑? u ? w u-w u?w 的邊權(quán)不是第二大。原本 u ? x u-x u?x 的一條邊,變成 w ? x w-x w?x 的一條邊。

所以上面的形如 x ? u x-u x?u :不一定表示原先加入的 m m m 條邊就是 x ? u x-u x?u,而是可能通過 x ? a ? b ? c ? . . . ? u x-a-b-c-...-u x?a?b?c?...?u ,不斷合并,可能代指的是一條簡單路徑。

參考code文章來源地址http://www.zghlxwxcb.cn/news/detail-475058.html

#include <bits/stdc++.h>
using namespace std;

#define N 400005

#define pb push_back
int fa[N];
struct node {
	int x, y, z;
} b[N];
int ans[N], n, m, Q;
set<array<int, 2>> q[N];
set<int> e[N];

int get(int x) {
	if (fa[x] == x)
		return x;
	return fa[x] = get(fa[x]);
}

inline bool cmp(node x, node y) {
	return x.z < y.z;
}

void combine(int x, int y, int val) {
	for (auto u : e[x]) {
		while (1) {
			auto it = q[y].lower_bound({u, -1});
			if (it == q[y].end() || (*it)[0] != u)
				break;
			int id = (*it)[1];
			ans[id] = val;
			assert(q[y].count({u, id}));
			assert(q[u].count({y, id}));
			q[y].erase(it);
			q[u].erase({y, id});
		}
	}
	vector<array<int, 2>> delq;
	for (auto u : q[x]) {
		if (e[y].count(u[0])) {
			ans[u[1]] = val;
			q[u[0]].erase({x, u[1]});
			delq.pb(u);
		}
	}
	for (auto u : delq)
		q[x].erase(u);
	fa[x] = y;
	for (auto v : e[x]) {
		assert(e[v].count(x));
		e[v].erase(x);
		if (v != y) {
			e[v].insert(y);
			e[y].insert(v);
		}
	}
	e[x].clear();
	for (auto v : q[x]) {
		assert(v[0] != y);
		assert(q[v[0]].count({x, v[1]}));
		q[v[0]].erase({x, v[1]});
		q[v[0]].insert({y, v[1]});
		q[y].insert({v[0], v[1]});
	}
	q[x].clear();
}

int main() {
	freopen("path.in", "r", stdin);
	freopen("path.out", "w", stdout);
	scanf("%d%d%d", &n, &m, &Q);
	for (int i = 1; i <= n; i++)
		e[i].clear(), q[i].clear();
	for (int i = 1; i <= m; i++) {
		scanf("%d%d%d", &b[i].x, &b[i].y, &b[i].z);
		e[b[i].x].insert(b[i].y);
		e[b[i].y].insert(b[i].x);
	}
	for (int i = 1; i <= n; i++)
		fa[i] = i;
	sort(b + 1, b + 1 + m, cmp);
	for (int i = 1; i <= Q; i++) {
		ans[i] = 0;
		int x, y;
		scanf("%d%d", &x, &y);
		if (e[x].count(y)) {
			ans[i] = 1;
			continue;
		}
		q[x].insert({y, i});
		q[y].insert({x, i});
	}
	for (int i = 1; i <= m; i++) {
		b[i].x = get(b[i].x), b[i].y = get(b[i].y);
		if (b[i].x == b[i].y)
			continue;
		if (q[b[i].x].size() + e[b[i].x].size() > q[b[i].y].size() + e[b[i].y].size())
			swap(b[i].x, b[i].y);
		combine(b[i].x, b[i].y, b[i].z + 1);
	}
	for (int i = 1; i <= Q; i++)
		printf("%d\n", ans[i] - 1);
}

到了這里,關(guān)于【無碼專區(qū)1】簡單路徑的第二大邊權(quán)(啟發(fā)式合并+最小生成樹)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 啟發(fā)式算法之灰狼優(yōu)化算法

    啟發(fā)式算法之灰狼優(yōu)化算法

    蟻群算法?禿鷹算法?布谷鳥算法?魚群算法?猴群算法?這都是些啥? 這些算法聽起來都很接地氣,實(shí)際上也確實(shí)很接地氣。它們都是學(xué)者通過觀察動物們的行為得到的靈感,從而設(shè)計(jì)出來的精彩的算法。以動物命名的算法可遠(yuǎn)不止這些,比如還有蜂群算法、狼群算法、蝙

    2024年02月13日
    瀏覽(19)
  • 人工大猩猩部隊(duì)優(yōu)化器:一種新的面向全局優(yōu)化問題的自然啟發(fā)元啟發(fā)式算法(Matlab代碼實(shí)現(xiàn))

    人工大猩猩部隊(duì)優(yōu)化器:一種新的面向全局優(yōu)化問題的自然啟發(fā)元啟發(fā)式算法(Matlab代碼實(shí)現(xiàn))

    ???????目錄 ??1 概述 ??2 運(yùn)行結(jié)果 ??3 參考文獻(xiàn) ?????4 Matlab代碼 元啟發(fā)式在解決優(yōu)化問題方面發(fā)揮著關(guān)鍵作用,其中大多數(shù)都受到自然界中自然生物集體智慧的啟發(fā)。本文提出了一種新的元啟發(fā)式算法,其靈感來自自然界大猩猩部隊(duì)的社會智能,稱為人工大猩猩部

    2024年02月01日
    瀏覽(25)
  • 樹上啟發(fā)式合并(dsu on tree)

    dsu on tree dsu text{dsu} dsu 一般指 disjoint?set?union text{disjoint set union} disjoint?set?union ,即并查集。 dsu?on?tree text{dsu on tree} dsu?on?tree 指樹上合并與查詢操作,但它的實(shí)現(xiàn)和普通的并查集并無關(guān)聯(lián),兩者的共同點(diǎn)僅僅在于都能合并集合和查詢而已。 dsu?on?tree text{dsu on tree} d

    2024年02月16日
    瀏覽(20)
  • 非梯度類啟發(fā)式搜索算法:Nelder Mead

    非梯度類啟發(fā)式搜索算法:Nelder Mead

    Hello,今天給大家介紹一種不基于梯度的優(yōu)化算法 Nelder Mead。 Nelder Mead?算法通常是用來求解非線性(nonlinear)、導(dǎo)函數(shù)未知情況下目標(biāo)函數(shù)的最大值或者最小值。學(xué)過梯度下降的同學(xué)應(yīng)該知道,梯度下降類算法的每一步都需要計(jì)算當(dāng)前位置的梯度,從而更新當(dāng)前解使得最終逐

    2024年02月02日
    瀏覽(23)
  • 【啟發(fā)式算法】灰狼優(yōu)化算法【附python實(shí)現(xiàn)代碼】

    【啟發(fā)式算法】灰狼優(yōu)化算法【附python實(shí)現(xiàn)代碼】

    寫在前面: 首先感謝兄弟們的訂閱,讓我有創(chuàng)作的動力,在創(chuàng)作過程我會盡最大能力,保證作品的質(zhì)量,如果有問題,可以私信我,讓我們攜手共進(jìn),共創(chuàng)輝煌。 路雖遠(yuǎn),行則將至;事雖難,做則必成。只要有愚公移山的志氣、滴水穿石的毅力,腳踏實(shí)地,埋頭苦干,積跬

    2024年02月16日
    瀏覽(25)
  • 求解三維裝箱問題的啟發(fā)式深度優(yōu)先搜索算法(python)

    求解三維裝箱問題的啟發(fā)式深度優(yōu)先搜索算法(python)

    給定一個容器(其體積為 V V V ) 和一系列待裝載的箱子,容器和箱子的形狀都是長方體。問題的目標(biāo)是要確定一個可行的箱子放置方案使得在滿足給定裝載約束的情況下,容器中包含的箱子總體積 S S S 盡可能的大,即填充率盡可能的大,這里填充率指的是 S / V ? 100 % S/ V * 1

    2024年02月05日
    瀏覽(25)
  • 元啟發(fā)式算法庫 MEALPY 初體驗(yàn)-遺傳算法為例

    元啟發(fā)式算法庫 MEALPY 初體驗(yàn)-遺傳算法為例

    官網(wǎng): MealPY官網(wǎng) 開源許可: (GPL) V3 MEALPY (MEta-heuristic ALgorithms in PYthon) 是一個提供最新自然啟發(fā)式元啟發(fā)算法的Python模塊,它是最大的此類Python模塊之一。這些算法模仿自然界中的成功過程,包括生物系統(tǒng)以及物理和化學(xué)過程。mealPy 的目標(biāo)是免費(fèi)向所有人分享元啟發(fā)領(lǐng)域的知識

    2024年04月11日
    瀏覽(20)
  • 【論文閱讀】聚集多個啟發(fā)式信號作為監(jiān)督用于無監(jiān)督作文自動評分

    【論文閱讀】聚集多個啟發(fā)式信號作為監(jiān)督用于無監(jiān)督作文自動評分

    本文提出一個新的無監(jiān)督的AES方法ULRA,它不需要真實(shí)的作文分?jǐn)?shù)標(biāo)簽進(jìn)行訓(xùn)練; ULRA的核心思想是使用多個啟發(fā)式的質(zhì)量信號作為偽標(biāo)準(zhǔn)答案,然后通過學(xué)習(xí)這些質(zhì)量信號的聚合來訓(xùn)練神經(jīng)自動評分模型。 為了將這些不一致的質(zhì)量信號聚合為一個統(tǒng)一的監(jiān)督信號,我們將自動

    2024年02月16日
    瀏覽(28)
  • 如何進(jìn)行測試分析與設(shè)計(jì)-HTSM啟發(fā)式測試策略模型 | 京東云技術(shù)團(tuán)隊(duì)

    如何進(jìn)行測試分析與設(shè)計(jì)-HTSM啟發(fā)式測試策略模型 | 京東云技術(shù)團(tuán)隊(duì)

    測試,沒有分析與設(shè)計(jì)就失去了靈魂; 測試人員在編寫用例之前,該如何進(jìn)行測試分析與設(shè)計(jì)呢?上次在《測試的底層邏輯》中講到了【輸入輸出測試模型】,還講到了【2W+1H測試分析法】,但2W1H分析法是初步的分析方法,具體在測試中如何落地,還需要更細(xì)的設(shè)計(jì)。 今天

    2024年02月05日
    瀏覽(23)
  • 啟發(fā)式搜索算法:A算法(全局、局部擇優(yōu)算法)+A*算法 解決八數(shù)碼問題

    啟發(fā)式搜索算法:A算法(全局、局部擇優(yōu)算法)+A*算法 解決八數(shù)碼問題

    參考博客:人工智能搜索策略:A*算法 在圖搜索算法中,如果能在搜索的每一步都利用估價函數(shù)f(n)=g(n)+h(n)對Open表中的節(jié)點(diǎn)進(jìn)行排序,則該搜索算法為 A算法 。由于估價函數(shù)中帶有問題自身的啟發(fā)性信息,因此,A算法又稱為啟發(fā)式搜索算法。 對啟發(fā)式搜索算法,又可根據(jù)搜

    2024年02月10日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包