您的位置:首页 > 其它

拓扑排序-邻接矩阵表示

2017-12-18 17:53 357 查看

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

Time Limit: 1000MS
Memory Limit: 65536KB
Submit

Statistic
Discuss

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

;
int Check
;
int TP
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: