数据结构实验之图论十:判断给定图是否存在合法拓扑序列
题目提交网站
https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/3000/pid/2140.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[11][11];//用邻接矩阵来做
int vex,arc;//这个是定点数和边数
int visit[11];
int queue[11];//队列
int front,rear;//队列
int count;//计数用的
int b[11];//记每个顶点入度
int c[11];//即每个顶点出度的
void f()
{
int i,j;
for(i=1;i<=vex;i++)//将每个顶点的入度和出度找出来
{
for(j=1;j<=vex;j++)
{
if(a[i][j])
{
c[i]++;
b[j]++;
}
}
}
for(i=1;i<=vex;i++)//如果该顶点的入读为零则入栈
{
if(!b[i])
{
queue[++rear]=i;
}
}
while(front!=rear)
{
++front;//对首元素出栈
count++;
visit[queue[front]]=1;
for(i=1;i<=vex;i++)//对于出栈的元素,将其临界点的入栈减一,如果临界点元素的入度为零则入栈
{
if(!visit[i]&&a[queue[front]][i])
{
b[i]--;
if(!b[i])
queue[++rear]=b[i];
}
}
}
if(count==vex) printf("YES\n");//;判断是否存在环,即如果存在环则count<顶点数
else printf("NO\n");
}
int main()
{
int n,m,v1,v2;
while(~scanf("%d%d",&n,&m))
{
vex=n;
arc=m;
front=rear=0;
count=0;
memset(a,0,sizeof(a));
memset(visit,0,sizeof(visit));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
while(arc--)
{
scanf("%d%d",&v1,&v2);
a[v1][v2]=1;
}
f();
}
return 0;
}