1. 程式人生 > >拓撲排序-鄰接矩陣表示

拓撲排序-鄰接矩陣表示

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

Time Limit: 1000MS Memory Limit: 65536KB

Problem 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;
}