// Independent array-based backtracking checker. C++17, standard library only. #include #include #include #include #include #include #include #include using namespace std; using Quad=array; struct Search { vector blocks; array need{}; unsigned long long nodes=0; vector solution; bool dfs(const vector& active,int remaining) { ++nodes; if(remaining==0)return true; array counts{}; for(int q:active)for(int p:blocks[q])++counts[p]; int edge=-1,best=100000; for(int p=135;p>=0;--p)if(need[p]){ if(counts[p] next; for(int r:active){ if(r==q)continue; bool ok=true; for(int p:blocks[r])if(need[p]==0){ok=false;break;} if(ok)next.push_back(r); } solution.push_back(q); if(dfs(next,remaining-6))return true; solution.pop_back(); for(int p:blocks[q])++need[p]; } return false; } }; int main(int argc,char**argv){ if(argc<2){cerr<<"usage: check_links graphs.txt [first last]\n";return 2;} ifstream in(argv[1]);int total;in>>total;int lo=argc>2?stoi(argv[2]):0,hi=argc>3?stoi(argv[3]):total; unsigned long long allnodes=0;int cases=0,sat=0; int pairid[17][17];int pcount=0; for(int i=0;i<17;i++)for(int j=i+1;j<17;j++)pairid[i][j]=pairid[j][i]=pcount++; for(int g=0;g adj{};for(auto &a:adj)in>>a; if(g=hi)continue; vector> F(10);int index=0; for(int i=0;i<10;i++)for(int j=i+1;j<10;j++)if(adj[i]&(1u<0;}))S.blocks.push_back(Q); } vector active(S.blocks.size());iota(active.begin(),active.end(),0); bool yes=S.dfs(active,remaining);++cases;sat+=yes;allnodes+=S.nodes; cout<