码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序

时间:2016-04-21 20:12:16      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

细节!一定要细节啊!!

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXVEX 100

typedef struct EdgeNode{
	int adjvex;
	int weight;
	struct EdgeNode *next;
}EdgeNode;
typedef struct VertexNode{
	int in;
	int data;
	EdgeNode *firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct{
	AdjList adjlist;
	int numVertexes,numEdges;
}graphAdjList,*GraphAdjList;

int TopologicalSort(GraphAdjList GL){
	EdgeNode *e;
	int i,k,gettop;
	int top = -1,cnt = 0;
	int *stack;
	stack = (int *)malloc(GL->numVertexes*sizeof(int));
	for(i=0;i<GL->numVertexes;i++){
		if(GL->adjlist[i].in == 0){
			stack[++top] = i;
			printf("%d\n",i);
		} 
	}
//	for(i=0;i<top;i++) printf("qqqqqqqq %d\n",stack[i]);
//	printf("stack is %d\n",top);
	while(top>-1){		
		//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! 
		//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! 
		//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! 
		//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! 
		gettop = stack[top--];
	//	printf("%d    top = %d\n",GL->adjlist[gettop].data,top);
	printf("%d ",GL->adjlist[gettop].data);
		cnt++;
		for(e = GL->adjlist[gettop].firstedge;e;e = e->next){
			k = e->adjvex;
	//		printf("adjlist[%d].in = %d\n",k,GL->adjlist[k].in);
			if(!(--GL->adjlist[k].in)){
				stack[++top] = k;
	//			printf("k = %d\n",k);
			}
		}
//		printf("top == %d\n",top);
	}
	printf("\n");
	if(cnt<GL->numVertexes) return 0;
	else return 1;
}

void CreateGraph(GraphAdjList G){
	int i,j,k,w;
	EdgeNode *e;
	printf("请输入顶点数和边数:\n");
	scanf("%d %d",&G->numVertexes,&G->numEdges);
	for(i=0;i<G->numVertexes;i++){
		G->adjlist[i].data = i;
		G->adjlist[i].in = 0;
		G->adjlist[i].firstedge = NULL;
	}
	
	for(k=0;k<G->numEdges;k++){
	//	printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
		scanf("%d %d",&i,&j);
		EdgeNode *temp = G->adjlist[i].firstedge;
		if(temp == NULL){
			EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode));
			NewEdge->adjvex = j;
		//	NewEdge->weight = w;
			NewEdge->next = NULL;
			G->adjlist[i].firstedge = NewEdge;
			G->adjlist[j].in++;
		}else{
			while(temp->next!=NULL) temp = temp->next;
			EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode));
			NewEdge->adjvex = j;
		//	NewEdge->weight = w;
			NewEdge->next = NULL;
			temp->next = NewEdge;
			G->adjlist[j].in++;
		}
	}
}
void test(graphAdjList G){
	int i,j,k;
	for(i=0;i<G.numVertexes;i++){
	//	printf("%d %d\n",G.adjlist[i].data,G.adjlist[i].in);
		printf("%d     %d ",G.adjlist[i].in,G.adjlist[i].data);
		if(G.adjlist[i].firstedge){
			EdgeNode *temp = G.adjlist[i].firstedge;
			while(temp){
				printf("%d ",temp->adjvex);
				temp = temp->next;
			}
		}	
		else
			printf("no");
		printf("\n");
	}
}
int main(){
	graphAdjList G;
	CreateGraph(&G);
	printf("sssssssssssssssssssssssssssssss\n");
	//test(G);
	printf("sssssssssssssssssssssssssssssss\n");
	printf("                %d\n",TopologicalSort(&G));
	return 0;
}
/*
14 20
0 11
0 5
0 4
1 8
1 4
1 2
2 9
2 6
2 5
3 13
3 2
4 7
5 12
5 8
6 5
8 7
9 11
9 10
10 13
12 9
*/

  

拓扑排序

标签:

原文地址:http://www.cnblogs.com/zhuozhuo/p/5418331.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!