This commit is contained in:
Ämin Baumeler 2024-11-20 11:50:36 +01:00
parent e953d8aa1f
commit 1922396b71

View File

@ -339,23 +339,25 @@ int find_cycles(int *cycles, int *cyclescnt, int n, const int *children, \
* 1 otherwise. * 1 otherwise.
* *
* If there is no cycle, then the graph trivially satisfy this condition. * If there is no cycle, then the graph trivially satisfy this condition.
*
* If there are k-cycles, then a chord
* A) introduces a two-cycle, or
* B) introduces a (k-1)-cycle.
* So, if there are no two-cycles, then we must only test the cycles of length
* k where cyclescnt[k-1] is nonzero.
*
* Cycles of length two are trivially chordless. * Cycles of length two are trivially chordless.
* If there is a k-cycle, then a chord implies the existance of an l-cycle
* with l < k.
***/ ***/
int gischordless(int n, const int *parents, const int *parentslen, \ int gischordless(int n, const int *parents, const int *parentslen, \
const int *children, const int *childrenlen, const int *cycles, \ const int *children, const int *childrenlen, const int *cycles, \
const int *cyclescnt, int num_cycles) { const int *cyclescnt, int num_cycles) {
if (!num_cycles) return 1; if (!num_cycles) return 1;
const int hastwocycles = cyclescnt[2];
for (int clen=n; clen>2; clen--) { for (int clen=n; clen>2; clen--) {
if (!cyclescnt[clen]) continue; if (!cyclescnt[clen]) continue;
if (!hastwocycles && !cyclescnt[clen-1]) continue; // A chord can only exist if there is a cycle of length < clen
int shortercycleexists = 0;
for (int sclen = 2; sclen < clen; sclen++) {
if (cyclescnt[sclen]) {
shortercycleexists = 1;
break;
}
}
if (!shortercycleexists) return 1;
for (int i=0; i<cyclescnt[clen]; i++) { for (int i=0; i<cyclescnt[clen]; i++) {
const int bs = blocksize(n); const int bs = blocksize(n);
const int startidx = clen*bs + i*clen; // Cycle starts here const int startidx = clen*bs + i*clen; // Cycle starts here