📄 pointer.c
字号:
/* Assign a pointer link to a vertex. Edge e joins a vertex in blossom *//* u to a linked vertex. */#include "wmatch.h"void POINTER (int u, int v, int e){ int i, del;#ifdef DEBUG printf("Pointer u,v,e=%d %d %d-%d\n",u,v,END[OPPEDGE(e)],END[e]);#endif LINK[u] = -DUMMYEDGE; NEXTVTX[LASTVTX[u]] = DUMMYVERTEX; NEXTVTX[LASTVTX[v]] = DUMMYVERTEX; if (LASTVTX[u] != u) { i = MATE[NEXTVTX[u]]; del = -SLACK(i) / 2; } else del = LAST_D; i = u; while (i != DUMMYVERTEX) { Y[i] += del; NEXT_D[i] += del; i = NEXTVTX[i]; } if (LINK[v] < 0) { LINK[v] = e; NEXTPAIR[DUMMYEDGE] = DUMMYEDGE; SCAN (v, DELTA); return; } else { LINK[v] = e; return; }}/* Scan each vertex in the blossom whose base is x */void SCAN (int x, int del){ int u, del_e;#ifdef DEBUG printf("Scan del=%d x=%d\n",del,x);#endif newbase = BASE[x]; stopscan = NEXTVTX[LASTVTX[x]]; while (x != stopscan) { Y[x] += del; NEXT_D[x] = LAST_D; pairpoint = DUMMYEDGE; e = A[x]; while (e != 0) { neighbor = END[e]; u = BASE[neighbor]; if (LINK[u] < 0) { if (LINK[BMATE (u)] < 0 || LASTVTX[u] != u) { del_e = SLACK (e); if (NEXT_D[neighbor] > del_e) { NEXT_D[neighbor] = del_e; NEXTEDGE[neighbor] = e; } } } else if (u != newbase) { INSERT_PAIR(); } e = A[e]; } x = NEXTVTX[x]; } NEXTEDGE[newbase] = NEXTPAIR[DUMMYEDGE];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -