Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
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;
}