3 2 0 1 1 2 2 2 0 1 1 0 0 0
YES NO
a是b的师傅,b是c的师傅,那么a是c的师傅,如果说c是a的师傅则不合法。先给出m个(x,y),即x是y的师傅,最后判断这种输入逻辑是否合法。一开始觉得这道题用并查集应该可以做,但是该题目点与点之间有明确的关系,不能只是有同一种性质那么简单。用拓扑排序来做,点之间相连形成了一个有向图,题目就是来判断这个有向图里面是否有环,如果有则不合法。方法是每次找入度为0的点,如果找到,入度减1,与之相连的点也相应-1,如果没找到,那么则说明有向图里面存在环。
代码:
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=110;
int graph[maxn][maxn];
int indegree[maxn];
int n,m,x,y;
void topo()
{
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=m;i++)
{
cin>>x>>y;
if(!graph[x][y])
{
graph[x][y]=1;
indegree[y]++;//入度++
}
}
int flag=1;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)//找入度为0的点
{
if(indegree[j]==0)
{
indegree[j]--;
for(int k=0;k<n;k++)//与入度为0的点相连的点入度--
if(graph[j][k])
indegree[k]--;
break;//每次找到就break掉
}
}
if(j==n)//当每次找入度为0的点时找不到,说明有环
{
flag=0;
break;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
int main()
{
while(cin>>n>>m&&n)
{
topo();
}
return 0;
}
[ACM] hdu 3342 Legal or Not (拓扑排序),布布扣,bubuko.com
[ACM] hdu 3342 Legal or Not (拓扑排序)
原文地址:http://blog.csdn.net/sr_19930829/article/details/25273325