拓扑排序

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int map[500][500],vis[500],topo[500];
int n,t;  //点数
int m;  //边数
int dfs(int u)
{
    int i;
    vis[u]=-1;            //表示正在访问
    for (i=1;i<=n;i++)
      if (map[u][i])
      {
          if (vis[i]<0)     //表示存在有向环,失败退出
            return 0;
            else if (!vis[i]&&!dfs(i))
                return 0;
      }
      vis[u]=1;     //表示已经访问过了,并且它的子孙也都应经被访问过了                                                                                                                                                                                         因为它在dfs(u)中,在它前面有                                                                                      
      topo[t--]=u;
        return 1;
}
int topoo()
{
    int i;
    t=n;
    memset(vis,0,sizeof(vis));  //表示没有访问
    for (i=1;i<=n;i++)
       if (!vis[i]&&!dfs(i))
        return 0;
       return 1;
}
int main()
{
    int i,s,e;
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;i++)
      {
          scanf("%d%d",&s,&e);
          map[s][e]=1;
      }
      if (topoo())
      {
          for (i=1;i<=n;i++)
            printf("%d ",topo[i]);
            printf("\n");
      }
      else
        printf("此图不能构成拓扑结构\n");
      return 0;
}
这样的写比我们当时学的简单多了,当时我们学数据结构的时候要根据入度来判断,比较麻烦

你可能感兴趣的:(拓扑排序)