int solve() { Graph g; int path[SIZE], length, n, i; int source, target; source = 1; target = 3; if((g = createGraph()) == NULL) { return 1; } addVertex(g, 1, "Blah"); addVertex(g, 2, "Blah blah"); addVertex(g, 3, "Blah blah"); addVertex(g, 4, "Blah blah"); addVertex(g, 5, "Blah blah"); addVertex(g, 6, "Blah blah"); // addVertex(g, 7, "Blah blah"); addEdge(g, 1, 2, 1); addEdge(g, 1, 4, 1); addEdge(g, 2, 3, 1); addEdge(g, 4, 6, 1); addEdge(g, 5, 6, 1); addEdge(g, 6, 3, 1); // addEdge(g, 3, 4, 1); if(checkCycle(g)) { printf("The graph has a cycle\n"); } else { printf("The graph has no cycle\n"); } int weight; weight = shortestPath(g, source, target, path, &length); if(weight == INFINITIVE_VALUE) printf("No path between %d and %d\n", source, target); else { printf("Path between %d and %d\n", source, target); for(i = 0; i < length; i++) printf("%4d\n", path[i]); printf("Total weight: %d\n", weight); } dropGraph(g); return 0; }
int solve(FILE *f) { Graph g; int output[SIZE], n, i; if((g = createGraph()) == NULL) { return 1; } readData(f, g); findTopoClass(g); dropGraph(g); return 0; }
int main(int argc, char **argv){ //check usage if(argc != 4){ fprintf(stderr, "usage: \"./pagerank\" damping_factor diffPR maxIterations"); return EXIT_FAILURE; } //initialise i/o FILE *fin = fopen("collection.txt","r"); FILE *fout = fopen("pagerankList.txt","w"); double d, diffPR; int maxIterations; slist urls = newList((void*)strdup, free); d = atof(argv[1]); diffPR = atof(argv[2]); maxIterations = atoi(argv[3]); //read collection.txt char buffer[BUFF_SIZE]; while(fscanf(fin, "%s", buffer) != EOF){ assert(buffer[0]); listEnter(urls, buffer); } int len = listLength(urls); Url *aurls = malloc(len * sizeof(url)); Graph g = newGraph(len); Hashmap m = newHashmap((len*3)/2); //convert llist to array for faster reading int i; for(i = 0; i < len; i++){ aurls[i] = malloc(sizeof(url)); aurls[i]->name = (char*)readList(urls); aurls[i]->pRank = (1/(double)len); aurls[i]->notActuallyZero = 1; mapInsert(m, aurls[i]->name, i); listNext(urls); } listReset(urls); //build graph for(i = 0; i < len; i++){ strcpy(buffer, aurls[i]->name); strcat(buffer, ".txt"); FILE *webpage = fopen(buffer, "r"); char *seen = calloc(len, sizeof(char)); int nOutgoingLinks = 0; fscanf(webpage, "#start Section-1"); while (fscanf(webpage, "%s", buffer) != EOF){ if(!strcmp(buffer, "#end")){ break; } int j = mapSearch(m, buffer); if(j != -1 && j != i && !seen[j]){ insertEdge(g,j,i); seen[j] = 1; nOutgoingLinks++; } } if(!nOutgoingLinks){ int j; for(j = 0; j < len; j++){ if(j != i) { insertEdge(g, j, i); } } nOutgoingLinks = len - 1; aurls[i]->notActuallyZero = 0; } aurls[i]->outdeg = nOutgoingLinks; fclose(webpage); free(seen); } dropMap(m); //calculate pagerank double diff = diffPR, *newPRanks = malloc(len * sizeof(double)); for(i = 0; i < maxIterations && diff > diffPR - EPS; i++){ diff = 0; int j; for(j = 0; j < len; j++){ double sum = 0; slist inUrls; for(inUrls = GetAdjacencies(g, j); hasNext(inUrls); listNext(inUrls)){ int val = *(int*)readList(inUrls); sum += aurls[val]->pRank / aurls[val]->outdeg; } listReset(inUrls); sum *= d; sum += (1 - d)/len; diff += fabs(aurls[j]->pRank - sum); newPRanks[j] = sum; } for(j = 0; j < len; j++) { aurls[j]->pRank = newPRanks[j]; } } free(newPRanks); mergesort((void**)aurls, len, urlComp, 1); print(aurls, fout, len); for(i = 0; i < len; i++){ free(aurls[i]); } free(aurls); fclose(fin); fclose(fout); freeList(urls); dropGraph(g); return EXIT_SUCCESS; }
int solve() { Graph g; int output[SIZE], n, i; if((g = createGraph()) == NULL) { return 1; } addVertex(g, 1, "1"); addVertex(g, 2, "2"); addVertex(g, 3, "3"); addVertex(g, 4, "4"); addVertex(g, 5, "5"); addVertex(g, 6, "6"); addVertex(g, 7, "7"); // addVertex(g, 8, "8"); // addVertex(g, 9, "9"); // addVertex(g, 10, "10"); // addVertex(g, 11, "11"); // addVertex(g, 12, "12"); addEdge(g, 1, 2, 1); // addEdge(g, 2, 3, 1); // addEdge(g, 3, 1, 1); // addEdge(g, 1, 4, 1); // addEdge(g, 5, 1, 1); addEdge(g, 7, 1, 1); addEdge(g, 2, 5, 1); addEdge(g, 6, 3, 1); addEdge(g, 3, 2, 1); // addEdge(g, 7, 12, 1); // addEdge(g, 1, 5, 1); addEdge(g, 4, 5, 1); if(checkCycle(g)) { printf("Cycle here\n"); } else { printf("No cycle here\n"); } // printf("%s\n", getVertex(g, 7)); // printf("The value of %s is %d\n", "11", getKeyByVal(g, "11")); // n = indegree(g, 1, output); // printf("In degree list:\n"); // for(i = 0; i < n; i++) { // printf("%d\n", output[i]); // } // n = outdegree(g, 1, output); // printf("Out degree list:\n"); // for(i = 0; i < n; i++) { // printf("%d\n", output[i]); // } // printf("The number of components: %d\n", getComponents(g)); DAG(g); dropGraph(g); return 0; }