?? unpairs.c
字號:
#include "wmatch.h"/* Expands a blossom. Fixes up LINK and MATE. */void UNPAIR (int oldbase, int oldmate){ int e, newbase, u;#ifdef DEBUG printf("Unpair oldbase, oldmate=%d %d\n",oldbase, oldmate);#endif UNLINK (oldbase); newbase = BMATE (oldmate); if (newbase != oldbase) { LINK [oldbase] = -DUMMYEDGE; REMATCH (newbase, MATE[oldbase]); if (f == LASTEDGE[1]) LINK[secondmate] = -LASTEDGE[2]; else LINK[secondmate] = -LASTEDGE[1]; } e = LINK[oldmate]; u = BEND (OPPEDGE (e)); if (u == newbase) { POINTER (newbase, oldmate, e); return; } LINK[BMATE (u)] = -e; do { e = -LINK[u]; v = BMATE (u); POINTER (u, v, -LINK[v]); u = BEND (e); } while (u != newbase); e = OPPEDGE (e); POINTER (newbase, oldmate, e);}/* changes the matching along an alternating path *//* firstmate is the first base vertex on the path *//* edge e is the new matched edge for firstmate */void REMATCH (int firstmate, int e) {#ifdef DEBUG printf("Rematch firstmate=%d e=%d-%d\n",firstmate, END[OPPEDGE(e)], END[e]);#endif MATE[firstmate] = e; nexte = -LINK[firstmate]; while (nexte != DUMMYEDGE) { e = nexte; f = OPPEDGE (e); firstmate = BEND (e); secondmate = BEND (f); nexte = -LINK[firstmate]; LINK[firstmate] = -MATE[secondmate]; LINK[secondmate] = -MATE[firstmate]; MATE[firstmate] = f; MATE[secondmate] = e; }}/* unlinks subblossoms in a blossom. oldbase is the base of the blossom to *//* be unlinked. */void UNLINK (int oldbase){ int k, j=1;#ifdef DEBUG printf("Unlink oldbase=%d\n",oldbase);#endif i = NEXTVTX[oldbase]; newbase = NEXTVTX[oldbase]; nextbase = NEXTVTX[LASTVTX[newbase]]; e = LINK[nextbase];UL2: do { nextedge = OPPEDGE (LINK[newbase]); for (k=1; k <= 2; ++k) { LINK[newbase] = -LINK[newbase]; BASE[i] = newbase; i = NEXTVTX[i]; while (i != nextbase) { BASE[i] = newbase; i = NEXTVTX[i]; } newbase = nextbase; nextbase = NEXTVTX[LASTVTX[newbase]]; } } while (LINK[nextbase] == nextedge); if (j==1) { LASTEDGE[1] = nextedge; j++; nextedge = OPPEDGE (e); if (LINK[nextbase] == nextedge) { goto UL2; } } LASTEDGE[2] = nextedge; if (BASE[LASTVTX[oldbase]] == oldbase) NEXTVTX[oldbase] = newbase; else { NEXTVTX[oldbase] = DUMMYVERTEX; LASTVTX[oldbase] = oldbase; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -