static void test_set(void) { char *keys1[] = {"a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"}; char *keys2[] = {"a", "l", "a", "c", "a", "z", "a", "m"}; SetObject *a = set_new(); SetObject *b = set_new(); set_addfrom(a, (void**)keys1, 11); set_addfrom(b, (void**)keys2, 8); set_print(a); // { 'c', 'd', 'r', 'a', 'b', } set_print(b); // { 'c', 'l', 'm', 'a', 'z', } set_print(set_rsub(a, b)); //{ 'd', 'b', 'r', } set_print(set_ror(a, b)); //{ 'a', 'b', 'c', 'd', 'l', 'm', 'r', 'z', } set_print(set_rand(a, b)); //{ 'c', 'a', } set_print(set_rxor(a, b)); //{ 'b', 'd', 'l', 'm', 'r', 'z', } set_ior(a, b); set_print(a); set_isub(a, b); set_print(a); set_ixor(a, b); set_print(a); set_iand(a, b); set_print(a); set_free(a); set_free(b); char *keys3[] = {"a", "b"}; char *keys4[] = {"a", "b", "d", "c", "e", "f", "g", "h"}; SetObject *c = set_new(); SetObject *d = set_new(); set_addfrom(c, (void**)keys3, 2); set_addfrom(d, (void**)keys4, 8); set_print(set_xor(c, d)); set_print(set_and(c, d)); set_print(set_sub(c, d)); }
void set_sub(int p, int num) { int i; sub[p] = num; for (i = 0; i < n; i++) { if (adj[p][i] && !sub[i]) set_sub(i, num); } }
void Topsort(AdjList *G,int *indegree){ int i,j,k; get_in_degree(G,indegree); for(i = 1;i <= G->vexnum;i++){ k = get_zero(G,indegree); if(k != -1){ printf("%d \n",k); set_sub(G,indegree,k); } } }
main () { FILE *fin = fopen ("cowtour.in", "r"); fout = fopen ("cowtour.out", "w"); int i, j, r, s, d; fscanf (fin, "%d", &n); for (i = 0; i < n; i++) fscanf (fin, "%d %d", &x[i], &y[i]); for (i = 0; i < n; i++) for (j = 0; j < n; j++) fscanf (fin, "%1d", &adj[i][j]); for (i = 0; i < n; i++) adj[i][i] = 1; /* find subgraph */ memset(sub, 0, sizeof(sub)); int subnum = 0; for (i = 0; i < n; i++) { if (!sub[i]) set_sub(i, ++subnum); } /* shortest path */ for (s = 1; s <= subnum; s++) sp(s); double dia, min_dia = INFIN; /* connect subgraph 1 with 2, 3, ... , subnum */ for (r = 1; r < subnum; r++) { for (s = r+1; s <= subnum; s++) { int a, b; double d, len = INFIN; for (i = 0; i < n; i++) { if (sub[i] == r) { for (j = 0; j < n; j++) { if (sub[j] == s) { d = distant(x[i], y[i], x[j], y[j]); if (len > max[i] + max[j] + d) { a = i; b = j; len = max[i] + max[j] + d; } } } } } adj[a][b] = adj[b][a] = 1; dis[a][b] = dis[b][a] = distant(x[a], y[a], x[b], y[b]); for (i = 0; i < n; i++) { if (sub[i] == r) { for (j = 0; j < n; j++) { if (sub[j] == s) dis[i][j] = dis[j][i] = dis[i][a] + dis[a][b] + dis[b][j]; } } } dia = 0; for (i = 0; i < n; i++) { if (sub[i] == r || sub[i] == s) { for (j = 0; j < n; j++) { if (sub[j] == r || sub[j] == s) { if (dia < dis[i][j]) dia = dis[i][j]; } } } } if (min_dia > dia) min_dia = dia; } } fprintf(fout, "%.6f\n", min_dia); exit (0); }