HDU 3342 拓扑排序

来源:互联网 发布:单片机学习网站 编辑:程序博客网 时间:2024/05/21 00:16

拓扑排序的主要思想是

先统计每个点的入度,从入度为0的点开始,与它关联的点的入度减减,最后形成一个序列,注意可能存在环的情况,要考虑

 

#include<stdio.h>#include<string.h>int g[110][110],use[110],d[110],f[110];int main(){    int n,m;    while(scanf("%d%d",&n,&m)==2)    {      if(n==0)      break;      int i,j;      int a,b;      memset(g,0,sizeof(g));      memset(use,0,sizeof(use));      memset(d,0,sizeof(d));      memset(f,0,sizeof(f));      for(i=0;i<m;i++)      {        scanf("%d%d",&a,&b);        g[a][b]=1;      }     for(j=0;j<n;j++)     {      int q=0;      for(i=0;i<n;i++)      if(g[i][j]==1)      q++;      f[j]=q;     }      int t=0;      int s=0;      while(s<n&&t<n)      {        for(i=0;i<n;i++)        {         if(!use[i]&&!f[i])         {           use[i]=1;           d[t++]=i;           for(j=0;j<n;j++)           {             if(g[i][j]==1)             f[j]--;           }         }        }        s++;      }      if(t==n)      printf("YES\n");      else      printf("NO\n");    }    return 0;}                           


 

原创粉丝点击