Ich schrieb einen einfachen Algorithmus, um eine ungerichtete Grafik mit BFS zu klonen, aber es scheint etwas Logik falsch, dass ich nicht herausfinden kann. Kann jemand einen Blick darauf werfen?Clone ein Diagramm mit BFS (ungerichtet)
Die Idee ist, jeden Knoten zu besuchen und sie nur einmal zu kopieren, nach dem Kopieren eines Knotens, überprüfen, ob sein Nachbar nicht kopiert wird, reihen Sie diesen Nachbarn ein; Wenn sein Nachbar bereits kopiert ist, lege sie in den Nachbarvektor des anderen.
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
//key -> old node, value -> the new copy
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> m;
//the queue always contains old nodes that haven't been copied
queue<UndirectedGraphNode*> q;
if(node)
q.push(node);
while(!q.empty()) {
UndirectedGraphNode* n = q.front();
q.pop();
if(m.count(n)) continue; // if the node is already copied, continue
// create the copy
m[n] = new UndirectedGraphNode(n->label);
// loop through the neighbors, if it's copied already, add the new copy to new copy's neighbor list
for(UndirectedGraphNode* oldNei : n->neighbors) {
if(m.count(oldNei)) {
UndirectedGraphNode* newNei = m[oldNei];
m[n]->neighbors.push_back(newNei);
newNei->neighbors.push_back(m[n]);
}
else// if not in the map, it's not copied/visited yet
q.push(oldNei);
}
}
return m[node];
}
Hier ist der Knoten Struktur:
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
Hier ist der OJ Ich übe mit: https://leetcode.com/problems/clone-graph/
Ich bin damit einverstanden, es ist besser null Knoten Rand Fall Ihren Weg zu handhaben, aber ich verstehe es nicht, warum ich neu zu erschaffen haben Kopien von Knoten innerhalb der for-Schleife, ich denke, mein Weg sollte auch stimmen. Können Sie darauf hinweisen, warum ich falsch liege? – Arch1tect
Prüfen Bearbeiten Sie einen Teil der Antwort, warum Ihr Code falsch ist. – sudoer
Richtig, aber ist die Eingabe richtig? Wenn A und B Nachbarn sind, dann denke ich, dass A in der Nachbarliste von B sein sollte und B auch in der Nachbarliste von A sein muss. Mein Algorithmus basiert auf diesem .. – Arch1tect