zoukankan      html  css  js  c++  java
  • 有向图是否有环

    题目描述
    写程序判断有向图是否存在环。有向图的输入用n个二元组表示(u,v),表示从u到
    v有一条有向边,起点是u,终点是v。
    输入
    输入包括多组测试数据,每组测试数据首先是正整数n和m,表示有向图有n个节点
    (编号从1到n),m条有向边,接下来是m行,每行为两个正整数u和v,用空格隔开,
    表示从节点u到节点v有一条有向边,u和v都大于等于1且小于等于n
    最后一行为0 0,表示测试数据结束
    有向图的节点个数不超过100个,边的个数不超过1000
    输出
    如果该有向图存在环,输出YES,否则输出NO
    样例输入
    11 10
    1 2
    2 3
    4 3
    5 4
    6 5
    3 9
    10 9
    9 11
    7 8
    8 11
    2 2
    1 2
    2 1
    3 3
    1 2
    2 3
    3 1
    0 0
    样例输出
    NO
    YES
    YES

    代码如下:

     1 #include<iostream>
     2 #include<string.h>
     3 #include<stdio.h>
     4 #include<stdlib.h>
     5 using namespace std;
     6 
     7 int judge(int a[][2],int n)
     8 {
     9     for(int i=0;i<n;i++)
    10     {
    11         if(a[i][0]==0)
    12             return 1;
    13     }
    14     return 0;
    15 } 
    16 int main()
    17 {
    18     int a[100][2]={0};
    19     int n,m,l[1000][2];
    20     int i,k;
    21     while(cin>>n>>m)
    22     {
    23         if(n==0&&m==0)
    24           break;
    25         k=0;
    26           
    27         for(i=0;i<n;i++)
    28         {
    29             a[i][0]=0;
    30             a[i][1]=0;
    31         }
    32        for(i=0;i<m;i++)
    33        {
    34           cin>>l[i][0]>>l[i][1];
    35           a[l[i][0]-1][1]++;
    36           a[l[i][1]-1][0]++;
    37        }
    38        while(judge(a,n))
    39        {
    40          for(i=0;i<n;i++)
    41         {
    42             if(a[i][0]==0)
    43             {
    44                 for(int j=0;j<m;j++)
    45                 {
    46                     if(l[j][0]==i+1)
    47                     {
    48                         a[l[j][1]-1][0]--;
    49                     }
    50                 }
    51                 k++;
    52                 a[i][0]=1000;
    53             }
    54         }
    55        }
    56        if(k==n)
    57         cout<<"NO"<<endl;
    58        else
    59         cout<<"YES"<<endl;
    60     }
    61 }
  • 相关阅读:
    java10 var
    java lambda,方法引用
    Java集合总结
    Oracle/Sun JDK与OpenJDK的区别和联系
    IO基本知识
    字符串反转2单词内部不进行转换
    反转String 1
    java 左移<<&>>右移&>>无符号右移
    反射
    equals方法与hashcode方法
  • 原文地址:https://www.cnblogs.com/baigg1995/p/4583388.html
Copyright © 2011-2022 走看看