拓撲排序-鄰接矩陣表示
阿新 • • 發佈:2019-02-11
資料結構實驗之圖論十:判斷給定圖是否存在合法拓撲序列
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。
Input
輸入包含多組,每組格式如下。
第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10)
後面m行每行兩個整數a b,表示從a到b有一條有向邊。
Output
若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。
Example Input
1 0 2 2 1 2 2 1
Example Output
YES NO
#include<stdio.h> #define N 1005 int Pic[N][N]; int Check[N]; int TP[N]; int rear=0; void InitPic(int n){ for(int i=0;i<n;i++){ int row,col; scanf("%d %d",&row,&col); Pic[row-1][col-1]=1; } } int CheckIng(int start,int n){ for(int i=0;i<n;i++){ if(Pic[i][start]&&i!=start){ return 0; } } return 1; } void DeletIng(int start,int n){ for(int i=0;i<n;i++){ Pic[start][i]=0; } } void TpSort(int n){ for(int j=0;j<n;j++){ for(int i=0;i<n;i++){ if(CheckIng(i,n)&&!Check[i]){ DeletIng(i,n); Check[i]=1; TP[rear++]=i; } } } } void Print(int n){ for(int i=0;i<n;i++){ printf("%d ",TP[i]+1); } printf("\n"); } void RollBack(int n){ for(int i=0;i<n;i++){ TP[i]=0; Check[i]=0; for(int j=0;j<n;j++){ Pic[i][j]=0; } } rear=0; } int main(){ int n,m; while(scanf("%d %d",&n,&m)!=EOF){ InitPic(m); TpSort(n); if(rear<n){ printf("NO\n"); } else{ printf("YES\n"); } //Print(n); RollBack(n); } return 0; }