• 图结构练习——判断给定图是否存在合法拓扑序列


    就是判断有向图中是否有环 由于开始用dfs搜忘记return了 纠结了一下午 还是经虎学长指点 才找到错误

    递归

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int g[101][101],c[101];
     4 int dfs(int u,int n)
     5 {
     6     int v;
     7     c[u] = -1;
     8     for(v = 1 ; v <= n ; v++)
     9         if(g[u][v])
    10         {
    11             if(c[v]<0)
    12             {
    13                 return 0;
    14             }
    15             else
    16                 if(!c[v]&&!dfs(v,n))
    17                     return 0;
    18         }
    19     c[u] = 1;
    20     return 1;
    21 }
    22 int toposort(int n)
    23 {
    24     int u;
    25     memset(c,0,sizeof(c));
    26     for(u = 1 ;u <= n ;u++)
    27         if(!c[u])
    28         {
    29             if(!dfs(u,n))
    30                 return 0;
    31         }
    32     return 1;
    33 }
    34 int main()
    35 {
    36     int n,m,i,j,a,b;
    37     while(scanf("%d%d", &n,&m)!=EOF)
    38     {
    39         memset(g,0,sizeof(g));
    40         for(i = 1 ;i <= m ; i++)
    41         {
    42             scanf("%d%d",&a,&b);
    43             g[a][b] = 1;
    44         }
    45         if(toposort(n))
    46             printf("YES\n");
    47         else
    48             printf("NO\n");
    49     }
    50     return 0;
    51 }  

    拓扑排序非递归
    若有环 最后肯定找不到n个入度为0的节点

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int de[101],g[101][101],flag;
     4 void topo(int n)
     5 {
     6     int i,j,k,w = 0;
     7     for(i = 1 ; i <= n ; i++)
     8     {
     9         w = 0;
    10         for(j = 1 ;j <= n ;j++)
    11         {
    12             if(de[j]==0)
    13             {    w = 1;
    14                 de[j]--;
    15                 for(k = 1 ; k <= n ; k++)
    16                     if(g[j][k])
    17                         de[k]--;
    18                 break;
    19             }
    20         }
    21         if(!w)
    22         {
    23             flag = 0;
    24             break;
    25         }
    26     }
    27 }
    28 int main()
    29 {
    30     int i,j,k,m,n,a,b;
    31     while(scanf("%d%d", &n,&m)!=EOF)
    32     {
    33         memset(de,0,sizeof(de));
    34         memset(g,0,sizeof(g));
    35         flag = 1;
    36         for(i =1 ;i <= m ;i++)
    37         {
    38             scanf("%d%d", &a,&b);
    39             g[a][b] = 1;
    40             de[b]++;
    41         }
    42         topo(n);
    43         if(flag)
    44             printf("YES\n");
    45         else
    46             printf("NO\n");
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    操作文件和目录【TLCL】
    nginx location正则写法
    elasticsearch分词器ik
    mongodb权限管理
    kafka调试遇到的问题
    mysql 安装
    jenkins 安装 + maven + git部署
    FTP服务搭建
    根据终端类型返回不同的访问内容
    上传jar包至nexus
  • 原文地址:https://www.cnblogs.com/shangyu/p/2603039.html
Copyright © 2020-2023  润新知