您的位置:首页 > 理论基础 > 数据结构算法

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

2017-12-02 16:23 357 查看
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

存在合法的拓扑序列==图中没有环

三个for循环,一个找入度为零的结点。一个将这个节点射出的边删除。这时,又会出现入度为零的边,再进行第三层循环。

//1、输入并用邻接矩阵保存点与点之间的关系,用数组保存每个点的入度。

//2、每次找一个入度为零的点,将所有和他相连的点的入度减一(删除相连的边)。

//3、重复步骤二,直到没有入度为零的点为止。

//4、如果这时还有入度不为零的点,证明有环,输出NO,反之输出YES。


#include <iostream>
#include <cstring>
using namespace std;
int map[20][20];
int visit[20];
int ducount[20];
int main()
{
int n, m, a, b, i, flag, j, k;
while(cin>>n>>m)
{
memset(map, 0, sizeof(map));
memset(visit, 0, sizeof(visit));
memset(ducount, 0, sizeof(ducount));
if(m == 0)//图中没有边,自然没有环,所以是合法的拓扑序列
{
cout<<"YES"<<endl;
}
else
{
for(i = 0; i < m; i++)
{
cin>>a>>b;
map[a][b] = 1;
ducount[b]++;//记录每个顶点的入度
}
for(i = 1; i <= n; i++)//遍历n次,只要还有结点就会进入
{
flag = 0;
for(j = 1; j<= n; j++)//每次遍历n个结点
{
if(visit[j] == 0 && ducount[j] == 0)//结点没有被访问过且入度为0
{
visit[j] = 1;//标记访问过
for(k = 1; k <= n; k++)//遍历n个结点看是否有跟j相连的
{
if(map[j][k] == 1)//与入度为0的j结点相连
{
ducount[k]--;//k的入度-1,就是删除与j相连的那条边
}
}
flag = 1;
break;//直接去判断下次
}
}
}
if(flag == 0)//仍有结点,但不是入度为0的。即图中还有环
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
return 0;
}


#include <iostream>
#include <cstring>
using namespace std;
int map[1100][1100];
int visit[1100];
int in[110];
int n;
void top()
{
int flag;
for(int i = 1; i <= n; i++)//进去找n次点
{
flag = 0;
for(int j = 1; j <= n; j++)
{
if(in[j] == 0 && visit[j] != 1)
{
flag = 1;
visit[j] = 1;
for(int k = 1; k <= n; k++)
{
if(map[j][k] == 1)
{
in[k]--;
}
}
break;//必须有break。只要找到一个相连的必须进行下一个点的查找,一共n个顶点
}
}
if(flag == 0)
break;
}
if(flag == 0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;

}
int main()
{
int m, v, u;
while(cin>>n>>m)
{
memset(map, 0, sizeof(map));
memset(visit, 0, sizeof(visit));
memset(in, 0, sizeof(in));
for(int i = 0; i < m; i++)
{
cin>>u>>v;
map[u][v] = 1;
in[v]++;
}
if(m == 0)
cout<<"YES"<<endl;
else
top();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐