SDUT-2140_判斷給定圖是否存在合法拓撲序列
阿新 • • 發佈:2018-12-04
資料結構實驗之圖論十:判斷給定圖是否存在合法拓撲序列
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; }