zoukankan      html  css  js  c++  java
  • 图结构练习——推断给定图是否存在合法拓扑序列(拓扑排序推断环)

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

    Time Limit: 1000MS Memory limit: 65536K

    题目描写叙述

     给定一个有向图,推断该有向图是否存在一个合法的拓扑序列。

    输入

     输入包括多组。每组格式例如以下。

    第一行包括两个整数n,m。分别代表该有向图的顶点数和边数。(n<=10)
    后面m行每行两个整数a b。表示从a到b有一条有向边。
     

    输出

     若给定有向图存在合法拓扑序列,则输出YES。否则输出NO。
     

    演示样例输入

    1 0
    2 2
    1 2
    2 1
    

    演示样例输出

    YES
    NO
    

    提示

     

    来源

     赵利强

    演示样例程序


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int n,m;
    int map[20][20];
    int in[20];
    void topo()
    {
        int i,j,k;
        int flag;
        for(i=1;i<=n;i++)
        {
            flag=0;
            for(j=1;j<=n;j++)
            {
                if(in[j]==0)
                {
                    flag=1;//仅仅要有入度为零的点就变成1
                    in[j]=-1;//删除这个结点
                    for(k=1;k<=n;k++)//与该节点相连的的结点的入度-1
                    {
                        if(map[j][k])
                        in[k]--;
                    }
                    break;//找到一个入度为零的就结束
                }
            }
            if(flag==0)//假设结点未输出完,图中就没有了入度为零的结点,证明有环,则不合法
            break;
        }
        if(flag==1)
        printf("YES
    ");
        else
        printf("NO
    ");
    }
    int main()
    {
        int u,v,i,j;
        while(~scanf("%d %d",&n,&m))
        {
            memset(map,0,sizeof(map));
            memset(in,0,sizeof(in));
            while(m--)
            {
                scanf("%d %d",&u,&v);
                map[u][v]=1;
                in[v]++;
            }
            topo();
        }
        return 0;
    }
    


  • 相关阅读:
    分享到新浪微博js
    好的读书网站发现、翻译 阅读中文之外的互联网精华
    ps字体下载素材网址
    如何使用HTML5,CSS3和PHP创建一个联系表格
    css3 精品网站
    IE6解决无法实现position:fixed浮动层固定在滚动页面(无抖动)
    nginx笔记
    给力shell命令
    常用v_视图
    关于获取运营商的IP地址
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6984723.html
Copyright © 2011-2022 走看看