|
|
1.1 root 1: #include "draw_dag.h"
2:
3:
4: // Merge all stems from the same node into a single one
5: // The width of the remaining node is appropriately widened while
6: // its height should be largest of the whole bunch.
7:
8: void dag_delstem()
9: {
10: Istems = new edge_t*[N_real_nodes];
11: Ostems = new edge_t*[N_real_nodes];
12: Stems = new int[N_real_nodes];
13:
14: int n_remove = 0;
15: int n_retain = 0;
16: for(int in = 0; in < 2; ++in)
17: {
18: edge_t **these = in ? Inedges : Outedges;
19: edge_t **those = in ? Outedges : Inedges;
20: edge_t **edges = in ? Istems : Ostems;
21: for(int v = 0; v < N_real_nodes; ++v)
22: {
23: // remove all stems from the edge list
24: edge_t *e, *elast, *stem;
25: edges[v] = NULL;
26: elast = NULL;
27: stem = NULL;
28: for(e = these[v]; e; e = elast ? elast->next : these[v])
29: {
30: if(these[e->node] || those[e->node]->next)
31: elast = e;
32: else if(!stem)
33: {
34: stem = e;
35: elast = e;
36: n_retain++;
37: }
38: else
39: {
40: if(elast)
41: elast->next = e->next;
42: else these[v] = e->next;
43: e->next = edges[v];
44: edges[v] = e;
45: n_remove++;
46: }
47: }
48:
49: if(edges[v])
50: {
51: // merge edges
52: int w = stem->node;
53: for(e = edges[v]; e; e = e->next)
54: {
55: stem->count += e->count;
56: stem->weight += e->weight;
57: those[e->node] = NULL;
58: Stems[e->node] = 1;
59: }
60: stem->link->count = stem->count;
61: stem->link->weight = stem->weight;
62: edges[v]->chain = stem;
63: }
64: }
65: }
66: }
67:
68:
69: // reinsert the stems
70: void dag_insstem()
71: {
72: for(int down = 0; down < 2; ++down)
73: {
74: edge_t **edges = down ? Ostems : Istems;
75: edge_t **these = down ? Outedges : Inedges;
76: edge_t **those = down ? Inedges : Outedges;
77: for(int v = 0; v < N_real_nodes; ++v)
78: {
79: if(!edges[v])
80: continue;
81:
82: // our representative
83: edge_t *stem = edges[v]->chain;
84: edges[v]->chain = NULL;
85:
86: // number of friends
87: int n_edges = 0;
88: for(edge_t *e = edges[v]; e; e = e->next)
89: n_edges += 1;
90:
91: // insert the nodes in the rank listing
92: int w = stem->node;
93: int *rank = Rank[Level[w]];
94: for(int n_rank = 0; rank[n_rank] != -1; ++n_rank)
95: ;
96: rank[n_rank+n_edges] = -1;
97: int pos = Invert[stem->node];
98: for(int i = n_rank+n_edges-1; i > pos+n_edges; --i)
99: {
100: rank[i] = rank[i-n_edges];
101: Invert[rank[i]] = i;
102: }
103:
104: edge_t *elast;
105: for(e = edges[v], i = pos+1; e; i++, elast = e, e = e->next)
106: {
107: int n = e->node;
108: those[n] = e->link;
109: stem->count -= e->count;
110: stem->weight -= e->weight;
111: Component[n] = Component[w];
112: rank[i] = n;
113: Invert[n] = i;
114: }
115: stem->link->count = stem->count;
116: stem->link->weight = stem->weight;
117:
118: // put these edges back in the proper edge list
119: elast->next = these[v];
120: these[v] = edges[v];
121: edges[v] = NULL;
122: }
123: }
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.