00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "eg_shrink_graph.h"
00026
00027
00028 EGsrkNode_t *EGsrkIdentifyNodes (EGsrkGraph_t * const G,
00029 EGsrkNode_t * const base,
00030 EGsrkNode_t * const srkN)
00031 {
00032 EGsrkNode_t *o_end;
00033 EGsrkEdge_t *c_edge,
00034 *o_edge;
00035 EGeUgraphEP_t *c_ep;
00036 EGeList_t *e_it,
00037 *e_end,
00038 *e_next;
00039 unsigned o_type;
00040
00041 EGesLink (&(base->parent), &(srkN->parent));
00042 EGlpNumAddTo (base->weight, srkN->weight);
00043
00044 EGeListSplice (&(srkN->members), &(base->members));
00045
00046 EGeListAddAfter (&(srkN->members), &(base->members));
00047 base->mmb_sz += srkN->mmb_sz + 1;
00048
00049
00050 e_end = &(base->node.edges);
00051 for (e_it = e_end->next; e_it != e_end; e_it = e_it->next)
00052 {
00053 c_ep = EGcontainerOf (e_it, EGeUgraphEP_t, cn);
00054 c_edge = EGcontainerOf (c_ep, EGsrkEdge_t, edge.ep[c_ep->type]);
00055 o_type = c_ep->type ? 0 : 1;
00056 o_end = EGcontainerOf (c_edge->edge.ep[o_type].node, EGsrkNode_t, node);
00057 o_end->hit = c_edge;
00058 }
00059 e_end = &(srkN->node.edges);
00060 e_next = e_it = e_end->next;
00061
00062
00063 for (; e_it != e_end; e_it = e_next)
00064 {
00065 e_next = e_next->next;
00066 c_ep = EGcontainerOf (e_it, EGeUgraphEP_t, cn);
00067 c_edge = EGcontainerOf (c_ep, EGsrkEdge_t, edge.ep[c_ep->type]);
00068 o_type = c_ep->type ? 0 : 1;
00069 o_end = EGcontainerOf (c_edge->edge.ep[o_type].node, EGsrkNode_t, node);
00070
00071 if (o_end == base)
00072 {
00073 EGlpNumSubTo (base->weight, c_edge->weight);
00074 EGlpNumSubTo (base->weight, c_edge->weight);
00075 EGeUgraphDelEdge (&(G->G), &(c_edge->edge));
00076 continue;
00077 }
00078 o_edge = o_end->hit;
00079
00080
00081 if (!o_edge)
00082 {
00083 EGeUgraphChangeEP (&(G->G), &(c_edge->edge), &(base->node), c_ep->type);
00084 continue;
00085 }
00086
00087
00088
00089 EGlpNumAddTo (o_edge->weight, c_edge->weight);
00090 EGeListSplice (&(c_edge->members), &(o_edge->members));
00091 EGeListAddAfter (&(c_edge->members), &(o_edge->members));
00092 o_edge->mmb_sz += c_edge->mmb_sz + 1;
00093 EGeUgraphDelEdge (&(G->G), &(c_edge->edge));
00094 }
00095
00096 EGeUgraphDelNode (&(G->G), &(srkN->node));
00097
00098
00099 e_end = &(base->node.edges);
00100 for (e_it = e_end->next; e_end != e_it; e_it = e_it->next)
00101 {
00102 c_ep = EGcontainerOf (e_it, EGeUgraphEP_t, cn);
00103 c_edge = EGcontainerOf (c_ep, EGsrkEdge_t, edge.ep[c_ep->type]);
00104 o_type = c_ep->type ? 0 : 1;
00105 o_end = EGcontainerOf (c_edge->edge.ep[o_type].node, EGsrkNode_t, node);
00106 o_end->hit = 0;
00107 }
00108
00109
00110 return base;
00111 }
00112
00113
00114
00115