// drawHighlighted //-------------------------------------------------------------------------- void cInputField::drawHighlighted(Surface &dest) { checkCursor(); checkRepeat(); inputFieldSurface.fill(Color::black); inputFieldSurface.drawButtonBorder(Color::darkGray, Color::white); inputFieldSurface.bltStringShadowed(4, 2, destString+strDisplayStart, Color::white, Color::black); static float timeForBlink = 0.0f; if ((timeForBlink += TimerInterface::getTimeSlice()) > 0.25f) { if (timeForBlink > 0.50f) { timeForBlink = 0.0f; } } else { int cursorPos=cInputField::cursorPos-strDisplayStart; if ((size_t)cursorPos >= maxCharCount) { // XXX hardcoded CHAR_PIXX (8) inputFieldSurface.bltString(((cursorPos - 1) * 8) + 4, 2, "_", Color::red); } else { // XXX hardcoded CHAR_PIXX(8) inputFieldSurface.bltString(cursorPos * 8 + 4, 2, "_", Color::red); } } inputFieldSurface.blt(dest, pos.x, pos.y); } // drawHighlighted
//When calling checkRepeat, the first call of x and y are in the same group int checkRepeat(Degree* indegree, int x, int y, Result* result, int key) { Node* ptr = (indegree+y)->head; int ret = 0; if (x == y) return 1; while(ptr != NULL) { if (checkRepeat(indegree, x, ptr->start_point, result, key) != 0) { if (ptr->edge_value == key) { //Node need to be deleted deleteNode(indegree, y, ptr); result->total_number--; result->total_weight -= ptr->edge_value; //printf("ptr->edege_value == key\n"); } else { //printf("ptr->edege_value != key\n"); } ret |= 1; } else { //printf("checkRepeat return 0 (%d, %d) %d\n", x+1, y+1, ptr->edge_value); } ptr = ptr->next; } return ret; }
// draw //-------------------------------------------------------------------------- void cInputField::draw(Surface &dest) { checkCursor(); checkRepeat(); inputFieldSurface.fill(Color::black); inputFieldSurface.drawButtonBorder(Color::white, Color::gray64); inputFieldSurface.bltString(4, 2, destString+strDisplayStart, Color::white); inputFieldSurface.blt(dest, pos.x, pos.y); } // draw
int main () { int T; scanf("%d", &T); while(T--) { int n, m; scanf("%d%d", &n, &m); //Initialize the map matrix for fast search weight //int* map = (int* )calloc(n*n, sizeof(int)); //Initialize the edges array for sort Edges* all_edges = (Edges* )malloc(sizeof(Edges) * m); //Initialize the indegree tree Degree* indegree = (Degree* )malloc(sizeof(Degree) * n); for (int i = 0; i < n; i++) { (indegree+i)->head = NULL; (indegree+i)->tail = NULL; } //Read (a, b), c into map matrix and edges array for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); //swap // if (a > b) // a ^= b ^= a ^= b; a--; b--; (all_edges+i)->x = a; (all_edges+i)->y = b; (all_edges+i)->weight = c; // if (*(map+a*n+b) == 0) // *(map+a*n+b) = c; // else { // if (*(map+a*n+b) > c) // *(map+a*n+b) = c; // } } //Initialize the Result ret Result ret; ret.total_number = 0; ret.total_weight = 0; //Initialize the group == make_set(n) // int* group = (int* )malloc(sizeof(int) * n); // for (int i = 0; i < n; i++) // *(group+i) = i; //Sort qsort(all_edges, m, sizeof(Edges), cmp); //Handle all edges for (int i = 0; i < m; i++) { Edges tmp = *(all_edges+i); int isSameGroup_1 = findGroup(indegree, tmp.x, tmp.y); int isSameGroup_2 = findGroup(indegree, tmp.y, tmp.x); printf("(%d, %d, %d) same group:%d\n", tmp.x+1, tmp.y+1, tmp.weight, isSameGroup_1 || isSameGroup_2); if ((isSameGroup_1 || isSameGroup_2) == 0) { ret.total_number++; ret.total_weight += tmp.weight; //update the indegree simultaneously Node* insert_node = (Node* )malloc(sizeof(Node)); insert_node->start_point = tmp.x; insert_node->edge_value = tmp.weight; insert_node->prev = NULL; insert_node->next = NULL; insertNode(indegree, tmp.y, insert_node); //printf("Hi, %d, %d\n", ret.total_number, ret.total_weight); } else { if (isSameGroup_1) { //printf("Oh_1\n"); checkRepeat(indegree, tmp.x, tmp.y, &ret, tmp.weight); } else { //printf("Oh_2\n"); checkRepeat(indegree, tmp.y, tmp.x, &ret, tmp.weight); } } printf("<%d, %d>\n", ret.total_number, ret.total_weight); } /* for (int i = 0; i < m; i++) printf("(%d, %d, %d) -> %d\n", ((all_edges+i)->x)+1, ((all_edges+i)->y)+1, (all_edges+i)->weight, *(map+((all_edges+i)->x)*n+((all_edges+i)->y))); */ printf("%d %d\n", ret.total_number, ret.total_weight); //Clean up //free(map); free(all_edges); free(indegree); //free(group); } return 0; }
/* Función que comprueba si el formato del fichero de configuración es correcto*/ int formatOK(FILE * p, int * errorMemoria) { int numNames = 0; // Número de nombres de la primera linea int numInterfaces = 0; // Número de interfaces char name[TAM]; // Almacena el nombre de las interfaces para compararlos con los de la primera línea char * interfaces = NULL; // Reserva dinámica de memoria para almacenar el nombre de las interfaces char head[TAM]; // Cadena que almacena la primera línea del fichero sin en el número de interfaces int oct1; // Recoge el primero octeto de la dirección int oct2; // Recoge el segundo octeto de la dirección int oct3; // Recoge el tercer octeto de la dirección int oct4; // Recoge el cuarto octeto de la dirección int i = 0; // Contador 1 int j = 0; // Contador 2 int flag = 0; // Bandera 1 int equal = 0; // Bandera 2 NODO1 * tableForwarding = NULL; // Puntero al primer elemento de la lista con la tabla de reenvío NODO1 * forwardingAux = NULL; // Auxiliar lista con la tabla de reenvío NODO1 * dirRepeat = NULL; // Puntero a nodo para recorrer la lista e ir comparando NODO3 * first = NULL; // Puntero a lista con cabecera NODO3 * aux = NULL; // Auxiliar lista cabecera fscanf(p,"%d", &numInterfaces); // Almacena el número de interfaces que debe haber fgets(head,TAM,p); // Guarda en cabecera la primera línea del fichero (sin el número de interfaces) for(i=0; i<=TAM; i++) { if((isspace(head[i]) != 0) && ((head[i+1] >= 'a' && head[i+1] <= 'z') || (head[i+1] >= 'A' && head[i+1] <= 'Z') || (head[i+1] >= '0' && head[i+1] <= '9'))) // El número de nombres de la primera linea es igual al número de espacios numNames++; else if(head[i] == '\n') i = TAM +1; // Hace que finalice el bucle } i = 0; // Devuelve i a 0 while(isspace(head[i]) != 0) // Quita los espacios iniciales de la cabecera { i++; } if(numNames == numInterfaces) // Si el número de nombres es igual al de interfaces, hay que comprobar el resto de líneas, si no => Error { if(fscanf(p,"%d.%d.%d.%d",&oct1,&oct2,&oct3,&oct4) == 4) // Si las direcciones tienen el formato correcto, comprueba los nombres { fgets(name, TAM, p); while(isspace(name[j]) != 0) // Quita los espacios del nombre { j++; } while(!feof(p)) // Recorre todo el fichero para comprobar que los nombres han sido dados en la cabecera { while(head[i] != '\n' && equal == 0) { while((name[j] != head[i]) && (head[i] != '\n')) { i++; j = 1; } if(head[i] == '\n') equal = -1; i++; j++; if(name[j] == '\n') { equal = 1; j = 1; i = 1; } } if((oct1 > 255)||(oct2 > 255)||(oct3 > 255)||(oct4 != 0)) // Comprueba que los octetos no sean mayores de 255 equal = -1; if((fscanf(p,"%d.%d.%d.%d",&oct1,&oct2,&oct3,&oct4) != 4) && (equal == -1)) // Si el formato de la dirección es erróneo o hay error en los nombres flag = 1; // => Error fgets(name, TAM, p); if(equal == 1) equal = 0; } } else // Si el formato de las direcciones es incorrecto => Error flag = 1; } else // Si el número de nombres no es igual al de interfaces => Error flag = 1; if(flag == 0) // Si no ha habido error en los casos contemplados anteriormente, comprobamos otros errores { interfaces = (char *) calloc(TAM, sizeof(char)); // Reserva dinámica de memoria para almacena el nombre de las interfaces if(interfaces != NULL) // Reserva correcta { fseek(p, 0, SEEK_SET); // Pone el puntero a fichero de nuevo al principio. fscanf(p,"%d",&numInterfaces); // Almacena el número de interfaces fgets(head, TAM, p); // Lee la primera línea para tener el puntero al comienzo de la tabla fscanf(p,"%d.%d.%d.%d",&oct1,&oct2,&oct3,&oct4); // Almacena la dirección de la siguiente interfaz fscanf(p,"%s",interfaces); // Nombre de la interfaz correspondiente a la dirección anterior while(!feof(p)) // Crea una lista de numInterfaces nodos, para que sirva como tabla de reenvio { forwardingAux = makeNodeConf(oct1, oct2, oct3, oct4, interfaces, errorMemoria); // Crea los nodos linksNodeConf(forwardingAux, &tableForwarding); // Enlaza la lista fscanf(p,"%d.%d.%d.%d",&oct1,&oct2,&oct3,&oct4); // Almacena la dirección de la siguiente interfaz fscanf(p,"%s",interfaces); // Nombre de la interfaz correspondiente a la dirección anterior } dirRepeat = tableForwarding->sig; // El puntero para comprobar si está repetida va un nodo por delante flag = checkRepeat(tableForwarding, dirRepeat); // Llamada para comprobar si hay alguna dirección repetida if(flag == 0) // Si aún no se ha encontrado el error, seguimos comprobando { fseek(p, 0, SEEK_SET); // Pone el puntero a fichero de nuevo al principio fscanf(p,"%d",&numInterfaces); // Almacena el número de interfaces while(numInterfaces > 0) // Bucle para crear una lista con los nombres de la primera linea { fscanf(p,"%s",interfaces); // Guarda el primer nombre aux = makeNodeHead(interfaces, errorMemoria); // Crea los nodos de la lista linksNodeHead(aux, &first); // Enlaza los nodos de la lista numInterfaces--; } flag = checkInterface(tableForwarding,first); // Comprueba si hay algún nombre en la primera línea que luego no lleve dirección asignada } } else // Error de reserva { printf("Error 6: error de memoria\n"); (*errorMemoria) = 1; } } free(interfaces); // Libera la reserva dinámica de memoria removeHead(&first); // Elimina la lista con la cabecera removeConf(&tableForwarding); // Elimina la lista con la tabla de reenvio return (flag); }
void readOneOut(char *rmskFile) /* Read .out file rmskFile, check each line, and print OK lines to .tab. */ { struct lineFile *lf; char *line, *words[24]; int lineSize, wordCount; /* Open .out file and process header. */ lf = lineFileOpen(rmskFile, TRUE); if (!lineFileNext(lf, &line, &lineSize)) errAbort("Empty %s", lf->fileName); if (!startsWith(" SW perc perc", line)) { if (!startsWith(" SW perc perc", line)) errAbort("%s doesn't seem to be a RepeatMasker .out file, first " "line seen:\n%s", lf->fileName, line); } lineFileNext(lf, &line, &lineSize); lineFileNext(lf, &line, &lineSize); /* Process line oriented records of .out file. */ while (lineFileNext(lf, &line, &lineSize)) { static struct rmskOut2 r; char *s; wordCount = chopLine(line, words); if (wordCount < 14) errAbort("Expecting 14 or 15 words line %d of %s", lf->lineIx, lf->fileName); r.swScore = atoi(words[0]); r.milliDiv = makeMilli(words[1], lf); r.milliDel = makeMilli(words[2], lf); r.milliIns = makeMilli(words[3], lf); r.genoName = words[4]; r.genoStart = atoi(words[5])-1; r.genoEnd = atoi(words[6]); r.genoLeft = parenInt(words[7], lf); r.strand[0] = (words[8][0] == '+' ? '+' : '-'); r.repName = words[9]; r.repClass = words[10]; char *repClassTest = cloneString(r.repClass); stripChar(repClassTest, '('); stripChar(repClassTest, ')'); int nonDigitCount = countLeadingNondigits(repClassTest); int wordOffset = 0; // this repClass is only digits, (or only (digits) with surrounding parens) // this is the sign of an empty field here // due to custom library in use that has no class/family indication if (0 == nonDigitCount) { wordOffset = 1; r.repClass = cloneString("Unspecified"); r.repFamily = cloneString("Unspecified"); } else { s = strchr(r.repClass, '/'); if (s == NULL) r.repFamily = r.repClass; else { *s++ = 0; r.repFamily = s; } } r.repStart = parenInt(words[11-wordOffset], lf); r.repEnd = atoi(words[12-wordOffset]); r.repLeft = parenInt(words[13-wordOffset], lf); r.id = atoi(words[14-wordOffset]); if (words[8][0] == 'C') { r.repLeft = parenInt(words[11-wordOffset], lf); r.repStart = parenInt(words[13-wordOffset], lf); } if (checkRepeat(&r, lf)) { FILE *f = getFileForChrom(r.genoName); if (!noBin) fprintf(f, "%u\t", hFindBin(r.genoStart, r.genoEnd)); rmskOut2TabOut(&r, f); } } }