#include #include #include typedef int Matrix[15][15]; typedef int Vector[15]; int main (int argc, char **argv, char **envp); int StraightChain (int links); int min (int a, int b); int Validate (void); Matrix Links; Vector mask; int size, nextbit=0; int main (int argc, char **argv, char **envp) { int a, b, ct=1; stdin = fopen ("chains.in","r"); stdout = fopen ("chains.out","w"); while (1) { scanf ("%d",&size); if (size==0) break; memset (Links,0,sizeof Links); memset (mask,0,sizeof mask); while (1) { scanf ("%d %d",&a,&b); if (a==-1) break; if (!Links[a-1][b-1]) { Links[a-1][b-1]=Links[b-1][a-1]=1; } } printf("Set %d: Minimum links to open is %d\n",ct++,StraightChain(0)); } fclose (stdin); fclose (stdout); return EXIT_SUCCESS; } int StraightChain (int links) { int i, ct, len; len = Validate (); if (len != -1 && len<=links+1) return links; ct = size; i=nextbit; while (nextbit2) return -1; for (i=0; i < size; i++) {owner[i] = i; branch[i][i]=1;} for (i=1; i < size; i++) if (!mask[i]) for (j = 0; j < i; j++) if (!mask[j]) if (Links[i][j]) { m = min (owner[i],owner[j]); for (k=0; k < size; k++) if (!mask[k]) { branch[m][k] = branch[owner[i]][k] || branch[owner[j]][k]; if (branch[m][k]) owner[k] = m; } } for (i=0; i < size; i++) if (!mask[i] && owner[i]==i) { tot++; for (OK=j=0; j < size; j++) if (!mask[j]&&branch[i][j]&&cts[j]<2) { OK = 1; break;} if (!OK) return -1; } return tot; }