1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include<stdio.h>
#define N 10
void initstack(int*stack,int*n) { for(int i=0;i<*n+1;i++) stack[i]=-1; *n=0; } void push(int*stack,int *n,int elem) { stack[*n]=elem; (*n)++; } int pop(int*stack,int *n) { int temp; (*n)--; temp=stack[*n] ; stack[*n]=-1; return temp; } int isempty(int*stack,int *n) { if(*n) return 0; return 1; }
void Topologicalsort(int matrix[][N], int vexnum) { int indegree[N]={0}; int sortorder[N]={0}; int sortordercurse=0; int stack[N+1]; int curse=N+1; initstack(stack,&curse); int count=0; for(int j=0;j<vexnum;j++){ for(int i=0;i<vexnum;i++) indegree[j]+=matrix[i][j]; if(!(indegree[j])) push(stack,&curse,j); } while(!(isempty(stack,&curse))) { int tp; tp=pop(stack,&curse); sortorder[sortordercurse++]=tp; count++; for(int i=0;i<vexnum;i++){ if((indegree[i]==1)&&(matrix[tp][i]==1)) push(stack,&curse,i); indegree[i]-=matrix[tp][i]; } } if(count==vexnum){ printf("\n\n拓扑排序结果为:"); for(int i=0;i<sortordercurse;i++) printf(" V%d ",sortorder[i]+1);} else{ printf("\n\n拓扑排序不存在\n");} }
int main() {
int vexnum = 7; int matrix[N][N]={{0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,1}}; for(int i=0;i<N;i++){ for(int j=0;j<N;j++) printf(" %d ",matrix[i][j]); printf("\n"); } Topologicalsort(matrix, 7); printf("\n\n"); return 0; }
|