• 拓扑排序模板


    三种方法类似,记录数据和删除以没有前驱的顶点为尾的箭头时有点区别

     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("
    ");
    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("
    ");
    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("
    ");
    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 }
  • 相关阅读:
    dom2级事件兼容性写法
    cookie js案例
    cookie讲解
    js高级总结
    鼠标拖拽时,选择文字问题
    正则的细节
    正则捕获的细节及replace分析
    正则的使用及replace细讲
    while循环的讲解
    acwing 189. 乳草的入侵 bfs
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5740649.html
Copyright © 2020-2023  润新知