有向图求拓扑

Description
1、问题描述
给定一个有向图,求出其拓扑排序序列。


2、算法
⑴、在有向图中选一个没有前驱的顶点且输出之(如果有多个顶点皆没有前驱,序号小的顶点先输出,如果b,d皆无前驱时,先输出b)
⑵、从图中删除该顶点和所有以它为尾的弧
重复⑴⑵两步,直到所有顶点输出为止




Input
第一行:样本顶点个数,假设为n。
第二行,n个顶点(用空格隔开)
第三行开始到n+2行:每一行是某顶点(按第二行的输入为序)与其它顶点之间是否有边,1表示有边,0表示没有边




Output
有向图拓扑排序序列(顶点之间用空格隔开)(最后一个顶点之后也留有空格)




Sample Input
5
a b c d e
0 1 0 1 1
0 0 1 0 0
0 0 0 0 1
0 0 1 0 0
0 0 0 0 0


Sample Output

a b d c e 


#include <iostream> 

using namespace std;  

const int Max = 10; 

 

struct Graph{ 

   int MaxNum; 

   int MaxValue[Max]; 

   int Adj[Max][Max]; 

   bool visited[Max]; 

}; 

void initGr(Graph &G, int n){ 

   G.MaxNum = n; 

   int i, j;   

   for(i = 0; i < G.MaxNum; i++){ 

       for(j = 0; j < G.MaxNum; j++) 

           cin>>G.Adj[i][j]; 

   } 

   for(i = 0; i< G.MaxNum; i++){ 

       G.MaxValue[i] = i; 

       G.visited[i] = false; 

   } 

}  

void Change(Graph G,char b[]){ 

   int i, j, k, m; 

   for(m = 0; m <G.MaxNum; m++){ 

       for(i = 0; i < G.MaxNum; i++){ 

           for(j = 0; j < G.MaxNum; j++){ 

                if(G.Adj[j][i]) 

                    break; 

           } 

           if(j == G.MaxNum && !G.visited[i]) 

                break; 

       } 

       cout<<b[i]<<" "; 

       for(k = 0; k <G.MaxNum; k++) 

           G.Adj[i][k] = 0; 

       G.visited[i] = true; 

   } 

   cout<<endl; 

 

int main() 

   int t, n, i; 

   char *a;

   Graph G[1]; 

   //freopen("123.txt", "r", stdin); 

       cin>>n;

       a = new char[n+1];

       for(i = 0;i < n;i++)

           cin>>a[i];

       initGr(G[0], n); 

       Change(G[0],a); 

   return 0; 

}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值