标签:形式 队列 class 复合 输入数据 ace return front 信息
1 for(int i=0;i<n;i++) 2 { 3 printf("vertex %d indegree %d points to:",aim[i].vertex,indegree[i]); 4 point* temp=&aim[i]; 5 while(temp->next!=NULL) 6 { 7 temp=temp->next; 8 printf("%d ",temp->vertex); 9 } 10 printf("\n"); 11 }
1 //算法模板的设计 2 #include<iostream> 3 #include<cstdio> 4 #include<malloc.h> 5 #include<cstring> 6 #include<queue> 7 #include<algorithm> 8 using namespace std; 9 const int maxn = 30; 10 struct point 11 { 12 int vertex;//顶点 13 point* next; 14 }; 15 16 int indegree[maxn]; 17 point aim[maxn]; 18 int n; 19 20 int readin() 21 { 22 scanf("%d",&n); 23 memset(indegree,0,sizeof(int)*n); 24 for(int i=0;i<n;i++) 25 { 26 aim[i].next=NULL; 27 aim[i].vertex=i; 28 } 29 //初始化 30 int a,b; 31 while(scanf("%d%d",&a,&b)) 32 {//a->b 33 if(a==0&&b==0)break; 34 indegree[b]++;//入度加1 35 point* temp=&aim[a]; 36 while(temp->next!=NULL)temp=temp->next; 37 //找到存有指向结点链表的末端 38 temp->next=(point*)malloc(sizeof(point)); 39 temp=temp->next;//进入新的point点 40 temp->vertex=b;//a->b 41 temp->next=NULL; 42 }//完成邻接表的构建 43 return 0; 44 } 45 46 queue<int> psd; 47 int topo_sort(int* ans) 48 { 49 bool ok[maxn]; 50 memset(ok,false,sizeof(ok)); 51 int cur=0; 52 int num=n; 53 while(1) 54 { 55 if(num) 56 { 57 for(int i=0;i<n;i++) 58 { 59 if(ok[i])continue; 60 if(indegree[i]==0) 61 { 62 psd.push(i); 63 ok[i]=true; 64 num--; 65 } 66 }//检查所有入度0的顶点并入队,留下入队标记 67 } 68 if(psd.empty())break;//队列为空则排序结束 69 int p=psd.front();psd.pop(); 70 point* temp=&aim[p]; 71 ans[cur++]=p;//也可以写成ans[cur++]=aim[i].vertex; 72 //提出结点并排序 73 while(temp->next!=NULL) 74 { 75 temp=temp->next; 76 indegree[temp->vertex]--; 77 }//去掉相关有向边 78 } 79 return 0; 80 } 81 82 int ans[maxn]; 83 int main() 84 { 85 //freopen("input.txt","r",stdin); 86 //freopen("ans.txt","w",stdout); 87 readin(); 88 topo_sort(ans); 89 for(int i=0;i<n;i++) 90 { 91 printf("%3d",ans[i]); 92 } 93 printf("\n"); 94 return 0; 95 }
标签:形式 队列 class 复合 输入数据 ace return front 信息
原文地址:https://www.cnblogs.com/savennist/p/12287905.html