拓扑排序-邻接矩阵表示

数据结构实验之图论十:判断给定图是否存在合法拓扑序列

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

猜你喜欢

转载自blog.csdn.net/m0_37848958/article/details/78835519
今日推荐