C语言 拓扑排序基础

来源:互联网 发布:韩顺平 php大牛班课程 编辑:程序博客网 时间:2024/05/16 19:56
#include<stdio.h>#include<string.h>int in[1000],match[1000][1000];//in[]存储点的入度 ,match[]存储图的临界阵 int main(){    int m,n,i,j,p,q,k;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(match,0,sizeof(match));        memset(in,0,sizeof(in));        for(i=1;i<=m;i++)        {            scanf("%d%d",&p,&q);            if(match[p][q]==0)//此处别忘了重边的判断,否则会wa             {                match[p][q]=1;                in[q]++;//重边的时候,如果不做处理,度数为计算错误            }        }        //拓扑排序         for(i=1;i<=n;i++)//进行n次遍历,每次找出一个入度为0的节点                          for(j=1;j<=n;j++)//遍历所有节点              if(in[j]==0)//找出入度为0的节点          {            in[j]--; //度数递减,避免下次继续找到             if(i!=n)            {                printf("%d ",j);            }            else printf("%d\n",j);            for(k=1;k<=n;k++)            {                if(match[j][k]==1)// 删除与度数为0的节点相关联的边                     in[k]--;            }break;         }    }   return 0;}

点击打开链接

模板点击打开链接

0 0