मान लीजिए कि हमारे पास एक ही आकार की दो सूचियां cost_from और cost_to हैं जहां प्रत्येक अनुक्रमणिका i एक शहर का प्रतिनिधित्व करती है। यह शहर i से j तक एकतरफा सड़क बना रहा है और उनकी लागत लागत_ से [i] + लागत_ से [j] है। हमारे पास किनारों की एक सूची भी है जहां प्रत्येक किनारे में [x, y] इंगित करता है कि शहर x से y तक पहले से ही एकतरफा सड़क है। यदि हम 0 शहर से किसी भी शहर में जाना चाहते हैं, तो हमें आवश्यक सड़कों के निर्माण के लिए न्यूनतम लागत का पता लगाना होगा।
इसलिए, यदि इनपुट लागत_ से =[6, 2, 2, 12] लागत_ से =[2, 2, 3, 2] किनारों =[[0, 3]] जैसा है, तो आउटपुट 13 होगा, जैसा कि हम जा सकते हैं 9 की लागत के लिए 0 से 2 तक। उसके बाद, हम 4 की लागत के लिए 2 से 1 तक जा सकते हैं। और हमारे पास 0 से 3 तक जाने का रास्ता पहले से ही है। तो कुल 9 + 4 =13 है। पी>
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- n :=लागतों का आकार_से
- रिट:=0
- नक्शे के दो किनारों और किनारों को परिभाषित करें
- जी में सभी आइटम के लिए:
- इसे डालें[1] किनारों के अंत में[it[0]] लाल रंग के अंत में
- इसे डालें[0][it[1]]
- from_cost :=inf
- एक सेट का दौरा किया और दूसरा पहुंच योग्य सेट परिभाषित करें
- एक फ़ंक्शन dfs को परिभाषित करें, यह एक संख्या लेगा i
- अगर मैं नहीं गया और मैं पहुंच योग्य नहीं हूं, तो:
- देखे गए में मैं सम्मिलित करें
- किनारे में सभी j के लिए[i], करते हैं
- dfs(j)
- पीओ के अंत में i डालें
- अगर मैं नहीं गया और मैं पहुंच योग्य नहीं हूं, तो:
- फ़ंक्शन dfs2 को परिभाषित करें, यह एक नंबर लेगा मैं
- अगर मैं आ जाता हूं, तो
- सही लौटें
- अगर मैं पहुंच योग्य हूं
- झूठी वापसी
- मुझे विज़िट किया गया के रूप में चिह्नित करें और i को पहुंच योग्य के रूप में चिह्नित करें
- रिट:=सच
- सभी j के लिए redges[i], do
- ret :+ ret और dfs2(j)
- रिटर्न रिटर्न
- एक कतार q परिभाषित करें
- पहुंच योग्य में 0 डालें और q में 0 डालें
- जबकि (क्यू खाली नहीं है), करें:
- नोड:=q का पहला तत्व
- q से तत्व हटाएं
- किनारों में प्रत्येक i के लिए[नोड]
- अगर मैं पहुंच योग्य नहीं हूं, तो:
- i को रीचेबल में डालें, i को q में डालें
- से_लागत :=न्यूनतम से_लागत और लागत_से[नोड]
- अगर मैं पहुंच योग्य नहीं हूं, तो:
- global_min :=लागत का न्यूनतम तत्व
- रिट:=रेट + से_कॉस्ट - ग्लोबल_मिन
- एक सरणी पीओ परिभाषित करें
- मैं के लिए 0 से n की सीमा में, करते हैं
- dfs(i)
- सरणी को उल्टा करें
- पीओ में प्रत्येक के लिए, करते हैं
- अगर मैं पहुंच योग्य हूं, तो:
- अगले पुनरावृत्ति के लिए जाएं
- विज़िट किए गए सरणी को साफ़ करें
- प्रारंभिक:=dfs2(i)
- यदि प्रारंभिक सत्य है, तो:
- सर्वश्रेष्ठ:=जानकारी
- विज़िट किए गए प्रत्येक j के लिए:
- सर्वश्रेष्ठ:=न्यूनतम सर्वोत्तम और लागत_से[j]
- ret :=ret + global_min + best
- अगर मैं पहुंच योग्य हूं, तो:
- रिटर्न रिटर्न
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include
using namespace std;
class Solution {
public:
int solve(vector& costs_from, vector& costs_to, vector>& g) {
int n = costs_from.size();
int ret = 0;
map> edges;
map> redges;
for (auto& it : g) {
edges[it[0]].push_back(it[1]);
redges[it[1]].push_back(it[0]);
}
int from_cost = INT_MAX;
set visited;
set reachable;
queue q;
reachable.insert(0);
q.push(0);
while (!q.empty()) {
int node = q.front();
q.pop();
for (int i : edges[node]) {
if (!reachable.count(i)) {
reachable.insert(i);
q.push(i);
}
}
from_cost = min(from_cost, costs_from[node]);
}
int global_min = *min_element(costs_from.begin(), costs_from.end());
ret += from_cost - global_min;
vector po;
function dfs;
dfs = [&](int i) {
if (!visited.count(i) && !reachable.count(i)) {
visited.insert(i);
for (int j : edges[i]) {
dfs(j);
}
po.push_back(i);
}
};
for (int i = 0; i < n; i++) dfs(i);
reverse(po.begin(), po.end());
function dfs2;
dfs2 = [&](int i) {
if (visited.count(i)) return true;
if (reachable.count(i)) return false;
visited.insert(i);
reachable.insert(i);
bool ret = true;
for (int j : redges[i]) {
ret &= dfs2(j);
}
return ret;
};
for (int i : po) {
if (reachable.count(i)) continue;
visited.clear();
bool initial = dfs2(i);
if (initial) {
int best = INT_MAX;
for (int j : visited) {
best = min(best, costs_to[j]);
}
ret += global_min + best;
}
}
return ret;
}
};
int solve(vector& costs_from, vector& costs_to, vector>& edges) {
return (new Solution())->solve(costs_from, costs_to, edges);
}
int main(){
vector costs_from = {6, 2, 2, 12};
vector costs_to = {2, 2, 3, 2};
vector> edges = {{0, 3}};
cout << solve(costs_from, costs_to, edges);
} इनपुट
{6, 2, 2, 12}, {2, 2, 3, 2}, {{0, 3}} आउटपुट
13