您的位置:首页 > 其它

OJ2140图结构练习——判断给定图是否存在合法拓扑序列

2016-08-18 18:48 316 查看


图结构练习——判断给定图是否存在合法拓扑序列



Time Limit: 1000MS Memory limit: 65536K


题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。


输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 


输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 


示例输入

1 0
2 2
1 2
2 1



示例输出

YES
NO



提示

 就是判断是不是形成了环


来源

 赵利强


示例程序

 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<iostream>
using namespace std;

int p[15][15],d[15],vis[15];
int n,count,m;
void topo()
{
stack<int>s;
int i;
for(i=1; i<=n; i++)
if(d[i]==0)
{
s.push(i);
vis[i]=1;
}
while(!s.empty())
{
int t=s.top();
s.pop();
count++;
for(i=1; i<=n; i++)
{
if(p[t][i]&&!vis[i])
{
d[i]--;
if(!d[i])
{
vis[i]=1;
s.push(i);
}
}
}
}
}

int main()
{
int a,b,i;
while(~scanf("%d%d",&n,&m))
{
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
while(m--)
{
scanf("%d%d",&a,&b);
p[a][b]=1;
d[b]++;
}
count=0;
topo();
if(count!=n)
printf("NO\n");
else printf("YES\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐