📄 _corresp.c
字号:
/*******************************************************************************
+
+ LEDA 3.0
+
+
+ _corresp.c
+
+
+ Copyright (c) 1992 by Max-Planck-Institut fuer Informatik
+ Im Stadtwald, 6600 Saarbruecken, FRG
+ All rights reserved.
+
*******************************************************************************/
#include <LEDA/graph_alg.h>
static int edge_ord1(edge& e) { return index(source(e)); }
static int edge_ord2(edge& e) { return index(target(e)); }
bool compute_correspondence(const graph& G, edge_array<edge>& reversal)
{
// computes for every edge e = (v,w) in G its reversal reversal[e] = (w,v)
// in G ( nil if not present). Returns true if every edge has a
// reversal and false otherwise.
int n = G.max_i_node();
int count = 0;
edge e,r;
forall_edges(e,G) reversal[e] = 0;
list<edge> El = G.all_edges();
El.bucket_sort(0,n,&edge_ord2);
El.bucket_sort(0,n,&edge_ord1);
list<edge> El1 = G.all_edges();
El1.bucket_sort(0,n,&edge_ord1);
El1.bucket_sort(0,n,&edge_ord2);
// merge El and El1 to find corresponding edges
while (! El.empty() && ! El1.empty())
{ e = El.head();
r = El1.head();
if (target(r) == source(e))
if (source(r) == target(e))
{ reversal[e] = r;
El1.pop();
El.pop();
count++;
}
else
if (index(source(r)) < index(target(e)))
El1.pop();
else
El.pop();
else
if (index(target(r)) < index(source(e)))
El1.pop();
else
El.pop();
}
return (count = G.number_of_edges());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -