值得一提的是,用于标记的数组 book (代码中简写为了 bok)的每次清空,无论是调用 memset 函数
还是手写循环来清零,都会耗费大量时间。
而这一步骤可以通过用 int book 而非 bool book 来设置一个额外的标记 id ,避免了清空操作耗时。
具体的实现非常简单,参看代码。
1 bool find(int node, int id) 2 { 3 for (int p = fst[node]; p; p = nxt[p]) { 4 if (bok[v[p]] == id) 5 continue; 6 bok[v[p]] = id; 7 if (lnk[v[p]] && !find(lnk[v[p]], id)) 8 continue; 9 lnk[v[p]] = node; 10 return true; 11 } 12 return false; 13 } 14 15 int main() 16 { 17 /* input */ 18 19 for (i = 1; i <= n; ++i) 20 ans += find(i, i); 21 printf("%d\n", ans); 22 return 0; 23 }
时间: 2024-09-28 22:35:26