锘??xml version="1.0" encoding="utf-8" standalone="yes"?> floyd綆楁硶鏄竴涓粡鍏哥殑鍔ㄦ佽鍒掔畻娉曘傜敤閫氫織鐨勮璦鏉ユ弿榪扮殑璇濓紝棣栧厛鎴戜滑鐨勭洰鏍囨槸瀵繪壘浠庣偣i鍒扮偣j鐨勬渶鐭礬寰勩備粠鍔ㄦ佽鍒掔殑瑙掑害鐪嬮棶棰橈紝鎴戜滑闇瑕佷負(fù)榪欎釜鐩爣閲嶆柊鍋氫竴涓癄閲婏紙榪欎釜璇犻噴姝f槸鍔ㄦ佽鍒掓渶瀵屽垱閫犲姏鐨勭簿鍗庢墍鍦級錛宖loyd綆楁硶鍔犲叆浜嗚繖涓蹇?/p>
Ak(i,j)錛氳〃紺轟粠i鍒癹涓?/strong>涓嶇粡榪囩儲寮曟瘮k澶х殑鐐圭殑鏈鐭礬寰?/strong>銆?/p>
榪欎釜闄愬埗鐨勯噸瑕佷箣澶勫湪浜庯紝瀹冨皢鏈鐭礬寰勭殑姒傚康鍋氫簡闄愬埗錛屼嬌寰楄闄愬埗鏈夋満浼氭弧瓚寵凱浠e叧緋伙紝榪欎釜榪唬鍏崇郴灝卞湪浜庣爺絀訛細鍋囪Ak(i,j)宸茬煡錛屾槸鍚﹀彲浠ュ熸鎺ㄥ鍑篈k-1(i,j)銆?/p>
鍋囪鎴戠幇鍦ㄨ寰楀埌Ak(i,j)錛岃屾鏃禔k(i,j)宸茬煡錛岄偅涔堟垜鍙互鍒嗕袱縐嶆儏鍐墊潵鐪嬪緟闂錛?. Ak(i,j)娌塊旂粡榪囩偣k錛?. Ak(i,j)涓嶇粡榪囩偣k銆傚鏋滅粡榪囩偣k錛岄偅涔堝緢鏄劇劧錛孉k(i,j) = Ak-1(i,k) + Ak-1(k,j)錛屼負(fù)浠涔堟槸Ak-1鍛紵鍥犱負(fù)瀵?i,k)鍜?k,j)錛岀敱浜巏鏈韓灝辨槸婧愮偣錛堟垨鑰呰緇堢偣錛夛紝鍔犱笂鎴戜滑姹傜殑鏄疉k(i,j)錛屾墍浠ユ弧瓚充笉緇忚繃姣攌澶х殑鐐圭殑鏉′歡闄愬埗錛屼笖宸茬粡涓嶄細緇忚繃鐐筴錛屾晠寰楀嚭浜咥k-1榪欎釜鍊箋傞偅涔堥亣鍒扮浜岀鎯呭喌錛孉k(i,j)涓嶇粡榪囩偣k鏃訛紝鐢變簬娌℃湁緇忚繃鐐筴錛屾墍浠ユ牴鎹蹇碉紝鍙互寰楀嚭Ak(i,j)=Ak-1(i,j)銆傜幇鍦紝鎴戜滑紜俊鏈変笖鍙湁榪欎袱縐嶆儏鍐?--涓嶆槸緇忚繃鐐筴錛屽氨鏄笉緇忚繃鐐筴錛屾病鏈夌涓夌鎯呭喌浜嗭紝鏉′歡寰堝畬鏁達紝閭d箞鏄夋嫨鍝竴涓憿錛熷緢綆鍗曪紝姹傜殑鏄渶鐭礬寰勶紝褰撶劧鏄摢涓渶鐭紝姹傚彇鍝釜錛屾晠寰楀嚭寮忓瓙錛?/p>
Ak(i,j) = min( Ak-1(i,j), Ak-1(i,k) + Ak-1(k,j) )
static LJ_AINLINE int str_fastcmp(const char *a, const char *b, MSize len)
{
MSize i = 0;
lua_assert(len > 0);
lua_assert((((uintptr_t)a + len) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4);
do { /* Note: innocuous access up to end of string + 3. */
uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i);
if (v) {
i -= len;
#if LJ_LE
return (int32_t)i >= -3 ? (v << (32+(i<<3))) : 1;
#else
return (int32_t)i >= -3 ? (v >> (32+(i<<3))) : 1;
#endif
}
i += 4;
} while (i < len);
return 0;
}
]]>
棣栧厛鐢╢loyd綆楁硶姹傚嚭涓や袱涔嬮棿鐨勬渶鐭礬寰勩?br>鐒跺悗鎶婃墍鏈夌偣閮戒袱涓ら摼鎺ヨ搗鏉ワ紝鏉冨煎氨鏄畠浠殑鏈鐭礬寰勩?br>鍋囪鎸囧畾蹇呴』榪炴帴鐨勭偣鏈塏涓?br>閭d箞MinimalSteinerTree
鏍?wèi)涓殑鍐呯傄?guī)渶澶氭湁N-2涓?br>鍦ㄧ焊涓婄敾涓涓嬪氨鐭ラ亾浜嗭紝鍐呯偣鏈澶氱殑鎯呭喌灝辨槸鏍?wèi)湄?fù)婊′簩鍙夋爲(wèi)鐨勬儏鍐點?br>鑰岀敱浜庝箣鍓嶇殑floyd綆楁硶銆傛妸鏁翠釜鍥劇粰“緙?#8221;浜嗕竴涓嬨?br>鎵浠ユ爲(wèi)鏈澶氭湁N-2+N涓偣銆?br>鏋氫婦鎵鏈夊彲鑳界殑鐐歸泦銆傚姣忎釜鐐歸泦姹傛渶灝忕敓鎴愭爲(wèi)銆傚彇鏈灝忓煎嵆鍙?br>
鍙﹀涓縐嶆柟娉曟槸浣跨敤鍔ㄦ佽鍒掞紝璇︽儏璇瘋榪欓噷銆?br>
]]>
灝嗙偣鎸夌収欏烘椂閽堟帓搴?br>鍋囪鍥涜竟褰㈢殑鍥涗釜鐐笰, B, C, D銆傛寜鐓ч『鏃墮拡鏂瑰悜鎺掑簭銆?br>鎸夐『搴忔灇涓続
鎸夐『搴忔灇涓綜
B鍙栨渶鎺ヨ繎寮C涓績鐨勭偣錛孌鍚岀悊
鍦ㄧ焊涓婄敾鐢誨氨鍙互鐪嬪嚭錛屽鏋淐鏄掑鐨勶紝鍒橞D涔熸槸閫掑鐨勩?br>鍥犳C鎵簡涓鍦堬紝BD鍔犺搗鏉ユ渶澶氫篃鎵袱鍦堛?br>鏋氫婦A鏄疧(N)錛屾灇涓綜鏄疧(N)錛孊D鍧囨憡涓嬫潵涔熸槸O(N)
鎵浠ユ誨鏉傚害鏄疧(N^2)
铏界劧璇村鏉傚害璺熸爣紼嬩竴鏍鳳紝浣嗚繕鏄疶LE浜嗭紝鍝ュ緢涔呮病鍐機浠g爜浜嗭紝鐜板湪姣旇緝鎸?br>
]]>
鍥犳floyd鐨勬渶澶栧眰寰幆錛?br>for (k = 0; k < n; k++) ...
灝辨槸鍒嗗埆姹傚嚭 A0(i,j), A1(i,j), ..., An(i,j)
鎴戝薄嬈″啓閿檉loyd鐨勭▼搴忥紝浠婂ぉ鍙堝啓閿欎竴嬈°傘傚敖綆″畠寰堢煭錛屼絾鍘熺悊鐪熺殑寰堢墰姣斻?br>鍙鐭ラ亾浜嗗師鐞嗭紝灝變笉浼氬啀鍐欓敊浜嗭紒
]]>
澶氫釜涓嶅悓棰滆壊鐨勬柟鍧椾綅浜庝竴鍒楋紝浣犳瘡嬈″彲浠ユ秷闄や竴鐗囪繛緇殑鐩稿悓棰滆壊鐨勬柟鍧楋紝騫惰幏寰楀緱鍒嗭經(jīng)榪炵畫鏂瑰潡鐨勪釜鏁癪2锝濄?br>娑堥櫎瀹屽悗鍙寵竟鐨勬柟鍧楃Щ鍔ㄨ繃鏉ャ?br>闂紝鎬庢牱鐜╂墠鑳戒嬌寰楀垎鏈楂橈紵
榪欐槸涓閬撻粦涔︿笂闈㈢殑棰樼洰銆傛垜鎯充簡n涔呮兂涓嶅嚭鏉ャ傘?br>榛戜功鐨勮В娉曟槸鍔ㄦ佽鍒掞紝鏃墮棿澶嶆潅搴︿負(fù)O(N^4)錛岀┖闂村鏉傚害涓篛(N^3)銆?br>瑙夊緱鎸烘湁鎰忔濈殑錛屽氨鎶婂畠鐨勬柟娉曞疄鐜頒簡涓涓嬨?br>
blocks = [(1,2), (2,4), (3,5), (1,2), (3,6), (1,9), (2,10)]
best = {}
choose = {}
def sqr(x):
return x*x
def dfs(i, j, k):
if j < i:
return 0
if (i, j, k) in best:
return best[(i, j, k)]
m = [(sqr(k + blocks[j][1]) + dfs(i, j - 1, 0), j)]
for p in range(i, j):
if blocks[p][0] == blocks[j][0]:
m += [(dfs(i, p, k + blocks[j][1]) + dfs(p + 1, j - 1, 0), p)]
best[(i, j, k)], choose[(i, j, k)] = max(m)
return best[(i, j, k)]
def show(i, j, k, s):
if j < i:
return
#print 'show', i, j, k, blocks
c = choose[(i, j, k)]
if c == j:
s += sqr(blocks[c][1])
print blocks, 'remove', c, ':', blocks[c], 'score', s
del blocks[c]
show(i, j - 1, 0, s)
else:
show(c + 1, j - 1, 0, s)
v = blocks[c + 1][1]
blocks[c] = (blocks[c][0], blocks[c][1] + v)
del blocks[c + 1]
show(i, c, v, s)
dfs(0, len(blocks) - 1, 0)
show(0, len(blocks) - 1, 0, 0)
]]>
浜屻傛灇涓緄, j, k鐨勬椂鍊欙紝鍥哄畾i鐨勬椂鍊欙紝j鍜宬鍒嗗埆浠庡乏浠庡彸鎵弿鏁扮粍錛岀洿鍒頒袱涓鍒頒負(fù)姝€?br>涓夈傚浜庢瘡涓猧錛宬浠庡彸鎵弿鐨勫紑濮嬩綅緗槸閫掑噺鐨勩?br>
鐒跺悗灝辨湁浜嗕笅闈㈢殑灝忕▼搴忥細
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N = 10;
int K = 5;
int arr[] = {1, 2, 5, 4, 5, 10, 2, 3, 5, 1};
int main()
{
int a, b, c, i;
sort(arr, arr + N);
c = N - 1;
for (a = 0; a < c; a++) {
for (b = a + 1; b < c; b++) {
while (c >= 0 && arr[a] + arr[b] + arr[c] > K)
c--;
for (i = c; b < i; b++) {
while (i >= 0 && arr[a] + arr[b] + arr[i] > K)
i--;
if (i >= 0 && arr[a] + arr[b] + arr[i] == K)
printf("%d %d %d\n", arr[a], arr[b], arr[i]);
}
}
}
return 0;
}

]]>
姹傛渶澶ф祦鐨勬湰璐紝灝辨槸涓嶅仠鐨勫鎵懼騫胯礬寰勩傜洿鍒版壘涓嶅埌澧炲箍璺緞涓烘銆?br>瀵逛簬榪欎釜涓鑸х殑榪囩▼錛孌inic綆楁硶鐨勪紭鍖栧涓嬶細
錛?錛?br>Dinic綆楁硶棣栧厛瀵瑰浘榪涜涓嬈FS錛岀劧鍚庡湪BFS鐢熸垚鐨勫眰嬈″浘涓繘琛屽嬈FS銆?br>灞傛鍥劇殑鎰忔濆氨鏄紝鍙湁鍦˙FS鏍?wèi)涓繁搴︾浉宸?鐨勮妭鐐規(guī)墠鏄繛鎺ョ殑銆?br>榪欏氨鍒囨柇浜嗗師鏈夌殑鍥句腑鐨勮澶氫笉蹇呰鐨勮繛鎺ャ傚緢鐗涢鹼紒
榪欐槸闇瑕佽瘉鏄庣殑錛屼及璁¤瘉鏄庝篃寰堝鏉傘?br>
錛?錛?br>闄ゆ涔嬪錛屾瘡嬈FS瀹屽悗錛屼細鎵懼埌璺緞涓閲忔渶灝忕殑涓鏉¤竟銆?br>鍦ㄨ繖鏉¤竟涔嬪墠鐨勮礬寰勭殑瀹歸噺鏄ぇ浜庣瓑浜庤繖鏉¤竟鐨勫閲忕殑銆?br>閭d箞浠庤繖鏉¤竟涔嬪墠鐨勭偣錛屽彲鑳藉紩鍙戝嚭鍒殑澧炲箍璺緞銆?br>姣斿璇?nbsp;S -> b -> c -> d -> T 鏄竴鏉″騫胯礬寰勶紝瀹歸噺鏈灝忕殑杈規(guī)槸 b -> c銆?br>鍙兘瀛樺湪涓鏉?S -> b -> e -> f -> g -> T 榪欐牱鐨勫騫胯礬寰勩?br>榪欐牱鐨勮瘽錛屽湪鎵懼埌絎竴鏉″騫胯礬寰勫悗錛屽彧闇瑕佸洖婧埌 b 鐐癸紝灝卞彲浠ョ戶緇壘涓嬪幓浜嗐?br>榪欐牱鍋氱殑濂藉鏄紝閬垮厤浜嗘壘鍒頒竴鏉¤礬寰勫氨浠庡ご寮濮嬪鎵懼彟澶栦竴鏉$殑寮閿銆?br>涔熷氨鏄啀嬈′粠 S 瀵繪壘鍒?b 鐨勫紑閿銆?br>榪欎釜榪囩▼鐪嬩技澶嶆潅錛屼絾鏄唬鐮佸疄鐜拌搗鏉ュ緢浼橀泤錛屽洜涓哄畠鐨勬湰璐ㄥ氨鏄洖婧紒
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define MAX_VETXS 1024
#define MAX_EDGES 1024
int E[MAX_EDGES], next[MAX_EDGES], C[MAX_EDGES], M;
int V[MAX_VETXS], L[MAX_VETXS], Q[MAX_VETXS], N;
int S, T;
void __insert(int from, int to, int cap)
{
M++;
C[M] = cap;
E[M] = to;
next[M] = V[from];
V[from] = M;
}
void insert(int from, int to, int cap)
{
__insert(from, to, cap);
__insert(to, from, 0);
}
int bfs()
{
int h, t, e, u, v;
h = t = 0;
Q[t++] = S;
memset(L, 0, N*sizeof(L[0]));
L[S] = 1;
while (h != t) {
u = Q[h++];
for (e = V[u]; e; e = next[e]) {
v = E[e];
if (!L[v] && C[e] > 0) {
L[v] = L[u] + 1;
Q[t++] = v;
}
}
}
return L[T];
}
int dfs()
{
int t, u, v, e, i, f, r, back;
t = 1;
r = 0;
while (t) {
u = (t == 1) ? S : E[Q[t - 1]];
if (u == T) {
f = INT_MAX;
for (i = 1; i < t; i++) {
e = Q[i];
if (C[e] < f) {
f = C[e];
back = i;
}
}
for (i = 1; i < t; i++) {
e = Q[i];
C[e] -= f;
C[e^1] += f;
}
r += f;
t = back;
} else {
for (e = V[u]; e; e = next[e]) {
v = E[e];
if (L[v] == L[u] + 1 && C[e] > 0)
break;
}
if (e)
Q[t++] = e;
else {
t--;
L[u] = 0;
}
}
}
return r;
}
int dinic()
{
int f = 0;
while (bfs())
f += dfs();
return f;
}
int main()
{
int n, m, a, b, c, i;
freopen("d:\\in.txt", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF) {
S = 0;
T = m - 1;
N = m;
memset(V, 0, N*sizeof(V[0]));
M = 2;
for (i = 0; i < n; i++) {
scanf("%d%d%d", &a, &b, &c);
insert(a - 1, b - 1, c);
}
printf("%d\n", dinic());
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define MAX_LEN 256
int tbl[MAX_LEN];
char *str = "abbbbbbb";
char *ptn = "bb";
char spc[MAX_LEN];
int main()

{
int i, j;
memset(spc, ' ', sizeof(spc));
tbl[0] = 0;
for (i = 1; ptn[i]; i++)
{
for (j = tbl[i - 1]; j && ptn[j] != ptn[i]; j = tbl[j]);
if (ptn[j] == ptn[i])
j++;
tbl[i] = j;
}
printf("table:\n");
for (i = 0; ptn[i]; i++)
printf(" %c", ptn[i]);
printf("\n");
for (i = 0; ptn[i]; i++)
printf("%3d", tbl[i]);
printf("\n");
j = 0;
for (i = 0; str[i]; )
{
printf("\nmatching #%d\n", i);
printf("%s\n", str);
fwrite(spc, 1, i - j, stdout);
printf("%s\n", ptn);
fwrite(spc, 1, i, stdout);
printf("^\n");

if (str[i] == ptn[j])
{
i++;
j++;
printf("ok\n");
} else
{
if (j)
j = tbl[j - 1];
else
i++;
printf("jumped to %d\n", j);
}
if (!ptn[j])
printf("matched at %d\n", i);
}
return 0;
}
杈撳嚭錛?br>table:
b b
0 1
matching #0
abbbbbbb
bb
^
jumped to 0
matching #1
abbbbbbb
bb
^
ok
matching #2
abbbbbbb
bb
^
ok
matched at 3
matching #3
abbbbbbb
bb
^
jumped to 1
matching #3
abbbbbbb
bb
^
ok
matched at 4
matching #4
abbbbbbb
bb
^
jumped to 1
matching #4
abbbbbbb
bb
^
ok
matched at 5
matching #5
abbbbbbb
bb
^
jumped to 1
matching #5
abbbbbbb
bb
^
ok
matched at 6
matching #6
abbbbbbb
bb
^
jumped to 1
matching #6
abbbbbbb
bb
^
ok
matched at 7
matching #7
abbbbbbb
bb
^
jumped to 1
matching #7
abbbbbbb
bb
^
ok
matched at 8
涓銆佸畾涔変笌瀹氱悊
LCA錛歀east Common Ancestors錛堟渶榪戝叕鍏辯鍏堬級錛屽浜庝竴媯墊湁鏍規(guī)爲(wèi)T鐨勪換鎰忎袱涓妭鐐箄錛寁錛屾眰鍑篖CA(T, u, v)錛屽嵆紱昏窡鏈榪滅殑鑺傜偣x錛屼嬌寰梮鍚屾椂鏄痷鍜寁鐨勭鍏堛?br> 鍦ㄧ嚎綆楁硶錛氱敤姣旇緝闀跨殑鏃墮棿鍋氶澶勭悊錛屼絾鏄瓑淇℃伅鍏呰凍浠ュ悗姣忔鍥炵瓟璇㈤棶鍙渶瑕佺敤姣旇緝?yōu)畱鐨勬棄櫁淬?br> 紱葷嚎綆楁硶錛氬厛鎶婃墍鏈夌殑璇㈤棶璇誨叆錛岀劧鍚庝竴璧鋒妸鎵鏈夎闂洖絳斿畬鎴愩?br> RMQ錛氱粰鍑轟竴涓暟緇凙錛屽洖絳旇闂甊MQ(A, i, j)錛屽嵆A[i...j]涔嬮棿鐨勬渶鍊肩殑涓嬫爣銆?br>浜屻丏FS+RMQ
1錛塖parse Table錛圫T錛夌畻娉?br> 鎻忚堪錛?/strong>
鍒嗘瀽錛?/strong>鍒濆鍖栬繃紼嬪疄闄呬笂鏄竴涓姩鎬佽鍒掔殑鎬濇兂銆傛槗鐭ワ紝鍒濆鍖栬繃紼嬫晥鐜囨槸O(nlogn)錛岃屾煡璇㈣繃紼嬫晥鐜囨槸O(1)銆係T鏄竴涓湪綰跨畻娉曘?br> 紺轟緥錛?/strong>POJ 3368 瑙i鎶ュ憡
2錛夋眰瑙CA闂
鎻忚堪錛?/strong>
錛?錛塂FS錛氫粠鏍?wèi)T鐨勬牴寮濮嬶紝榪涜娣卞害浼樺厛閬嶅巻錛屽茍璁板綍涓嬫瘡嬈″埌杈劇殑欏剁偣銆傜涓涓殑緇撶偣鏄痳oot(T)錛屾瘡緇忚繃涓鏉¤竟閮借褰曞畠鐨勭鐐廣傜敱浜庢瘡鏉¤竟鎭板ソ緇忚繃2嬈★紝鍥犳涓鍏辮褰曚簡2n-1涓粨鐐癸紝鐢‥[1, ... , 2n-1]鏉ヨ〃紺恒?br> 錛?錛夎綆桼錛氱敤R[i]琛ㄧずE鏁扮粍涓涓涓間負(fù)i鐨勫厓绱犱笅鏍囷紝鍗沖鏋淩[u] < R[v]鏃訛紝DFS璁塊棶鐨勯『搴忔槸E[R[u], R[u]+1, ..., R[v]]銆傝櫧鐒跺叾涓寘鍚玼鐨勫悗浠o紝浣嗘繁搴︽渶灝忕殑榪樻槸u涓巚鐨勫叕鍏辯鍏堛?br> 錛?錛塕MQ錛氬綋R[u] ≥ R[v]鏃訛紝LCA[T, u, v] = RMQ(L, R[v], R[u])錛涘惁鍒橪CA[T, u, v] = RMQ(L, R[u], R[v])錛岃綆桼MQ銆?br> 鐢變簬RMQ涓嬌鐢ㄧ殑ST綆楁硶鏄湪綰跨畻娉曪紝鎵浠ヨ繖涓畻娉曚篃鏄湪綰跨畻娉曘?br> 紺轟緥錛?/strong>ZOJ 3195 瑙i鎶ュ憡銆?br>涓夈乀arjan綆楁硶
鎻忚堪錛?/strong>Tarjan綆楁硶鏄竴涓綰跨畻娉曪紝涔熷氨鏄鍙湁鍏堣幏寰楁墍鏈夌殑鏌ヨ錛屽啀鎸変竴涓壒瀹氱殑欏哄簭榪涜榪愮畻銆?/span>