1. 程式人生 > >SDUT-2140_判斷給定圖是否存在合法拓撲序列

SDUT-2140_判斷給定圖是否存在合法拓撲序列

資料結構實驗之圖論十:判斷給定圖是否存在合法拓撲序列

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。

Input

輸入包含多組,每組格式如下。

第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10)

後面m行每行兩個整數a b,表示從a到b有一條有向邊。

Output

若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。

Sample Input

1 0
2 2
1 2
2 1

Sample Output

YES
NO

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int n;/*n節點數量*/
int f[1050];/*記錄點是否被遍歷過*/
int INF = 1e9+7;/*相當於無窮大*/
int s[1050][1050];
int c[1050],r[1050];/*記錄節點的出度,入度*/

int main()
{
    int m,i,j,num;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        num = 0;
        for(i=1;i<=n;i++)
        {
            c[i] = r[i] = 0;
            f[i] = 0;
            for(j=1;j<=n;j++)
                s[i][j] = 0;
        }
        for(i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            c[a]++;
            r[b]++;
            s[a][b] = 1;
        }
        for(i=1;i<=n;i++)
        {
            if(!f[i]&&r[i]==0)
            {
                f[i] = 1;
                for(j=1;j<=n;j++)
                {
                    if(s[i][j])
                        r[j]--;
                }
                num++;
            }
        }
        if(num==n)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}