三種方法類似,記錄數據和刪除以沒有前驅的頂點為尾的箭頭時有點區別
1 /*hdu1285--采用二維數組記錄兩者之間的關系*/ 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 int map[510][510];//前驅數量 7 int indegree[510]; 8 int queue[510];//保存拓撲序列 9 void topo(int n) 10 { 11 int i,j,m,t=0; 12 for(j=1;j<=n;j++){ 13 for(i=1;i<=n;i++){ 14 if(indegree[i]==0){//找出前驅數量為零的的點即每次找到第一名 15 m=i;break; 16 } 17 } 18 queue[t++]=m;indegree[m]=-1;//將第一名的前驅數量設為-1 19 for(i=1;i<=n;++i){//第二步將前驅中含有第一名的點前驅數量減1 20 if(map[m][i])indegree[i]--; 21 } 22 } 23 printf("%d",queue[0]);//輸出拓撲序列 24 for(i=1;i<n;++i){ 25 printf(" %d",queue[i]); 26 } 27 printf("\n"); 28 } 29 int main() 30 { 31 int n,m,i,j,a,b; 32 while(scanf("%d%d",&n,&m)!=EOF){ 33 memset(indegree,0,sizeof(indegree));//初始化 34 memset(map,0,sizeof(map)); 35 for(i=0;i<m;++i){ 36 scanf("%d%d",&a,&b); 37 if(map[a][b]==0){ //避免重復的數據輸入 38 map[a][b]=1;indegree[b]++;//第一步記錄關系和點的前驅數量 39 } 40 } 41 topo(n);//調用拓撲排序 42 } 43 return 0; 44 }
1 /*hdu1285--采用鄰接表記錄兩者之間的關系*/ 2 #include<cstdio> 3 #include<cstring> 4 int head[510]; 5 int indegree[510]; 6 int queue[510]; 7 int num; 8 struct stu{ 9 int to,next; 10 }edge[2510]; 11 void inin(){//初始化 12 memset(indegree,0,sizeof(indegree)); 13 memset(head,-1,sizeof(head)); 14 num=0; 15 } 16 void add(int a,int b){//添加邊 17 stu E={b,head[a]}; 18 edge[num]=E; 19 head[a]=num++; 20 indegree[b]++; 21 } 22 void topo(int n){ 23 int i,j,id,t=0; 24 for(j=1;j<=n;j++){ 25 for(i=1;i<=n;i++){ 26 if(indegree[i]==0){ 27 id=i; 28 break; 29 } 30 } 31 queue[t++]=id;indegree[id]=-1; 32 for(i=head[id];i!=-1;i=edge[i].next){ 33 int k=edge[i].to; 34 indegree[k]--; 35 } 36 } 37 printf("%d",queue[0]);//輸出拓撲序列 38 for(i=1;i<n;++i){ 39 printf(" %d",queue[i]); 40 } 41 printf("\n"); 42 } 43 int main(){ 44 int n,m,i,j,a,b; 45 while(scanf("%d%d",&n,&m)!=EOF){ 46 inin(); 47 for(i=1;i<=m;i++){ 48 scanf("%d%d",&a,&b); 49 add(a,b); 50 } 51 topo(n); 52 } 53 return 0; 54 }
1 /*hdu1285--采用隊列記錄兩者之間的關系*/ 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 #include <functional> 7 using namespace std; 8 int map[510][510]; 9 int indegree[510]; 10 void topo(int n) 11 { 12 int i,j,m,t=0; 13 priority_queue<int,vector<int>,greater<int> >Q;//按從小到大順序輸出隊 14 for(i=1;i<=n;i++){ 15 if(indegree[i]==0){ 16 Q.push(i); 17 } 18 } 19 int sign=1; 20 while(!Q.empty()){ 21 int top=Q.top(); 22 Q.pop(); 23 indegree[top]=-1; 24 if(sign) 25 printf("%d",top); 26 else 27 printf(" %d",top); 28 sign=0; 29 for(i=1;i<=n;i++){ 30 if(map[top][i]){ 31 indegree[i]--; 32 if(indegree[i]==0){ 33 Q.push(i); 34 } 35 } 36 } 37 } 38 printf("\n"); 39 } 40 int main() 41 { 42 int n,m,i,j,a,b; 43 while(scanf("%d%d",&n,&m)!=EOF){ 44 memset(indegree,0,sizeof(indegree)); 45 memset(map,0,sizeof(map)); 46 for(i=0;i<m;++i){ 47 scanf("%d%d",&a,&b); 48 if(map[a][b]==0){ 49 map[a][b]=1;indegree[b]++; 50 } 51 } 52 topo(n); 53 } 54 return 0; 55 }