标签:
Legal or NotNO
题解:这个题的大致意思是说:一个A向B请教,B是A的师父,A是B的徒弟,一个人可以有多个徒弟,也可以有多个师父,但不能是同一个人的师父和徒弟(不合法)或者在整个大圈子里也不可以同是为一个人的师父并且也是其徒弟(例如A是B的师父,A也是B的徒弟、或者大圈子里A是B的师父,B是C的师父
A是C的徒弟)(均不合法)
主要的意思就是让判断是否存在环(如果可以进行拓扑排序,则表示无环,否则有环)
代码:(采用数组模拟关系)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
const int maxx=105;
int map[maxx][maxx];///记录两者之间的关系
int coun[maxx];///记录入度
int n,m;
int find()
{
int ans;
for(int k=0; k<n; k++)
{
ans=n;///每一轮都查看是否具有入度为0的点
for(int i=0; i<n; i++)
{
if(coun[i]==0)
{
coun[i]--;
ans=i;
break;
}
}
if(ans==n)///如果不存在入度为0 的点则有环
return 0;
for(int j=0; j<n; j++)
if(map[ans][j])
coun[j]--;///将与入度为0 的点的其他点入度均减一
}
return 1;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
memset(map,0,sizeof(map));
memset(coun,0,sizeof(coun));
for(int i=0; i<m; i++)
{int u,v;
scanf("%d %d",&u,&v);
if(!map[u][v])///有可能存在重复的关系去除
{
map[u][v]=1;
coun[v]++; ///入度加一
}
}
int flag=find();
if(flag)/// 如果可以进行拓扑排序则表示无环
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
///拓扑排序,判断是否有环(HDU 3342)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxx=505;
struct Arode
{
int to;
struct Arode *next;
};
Arode *List[maxx];//邻接表
int coun[maxx];///记录入度
char output[maxx];///输出表此时用不到(不用输出排序后的顺序)
int n,m;
void Topsort()
{
Arode *temp;
int i;
int top=-1;
bool bycile=false;
for(int i=n-1;i>=0;i--)
{
if(coun[i]==0)
{
coun[i]=top;
top=i;
}
}
int pos=0;
for(int i=0;i<n;i++)
{
if(top==-1)
{
bycile=true;
break;
}
int j=top;
top=coun[top];
///pos+=sprintf(output+pos,"%d ",j+1);///输出的顺序,此时用不到
temp=List[j];
while(temp!=NULL)
{
int k=temp->to;
if(--coun[k]==0)
{
coun[k]=top;
top=k;
}
temp=temp->next;
}
}
if(bycile)
printf("NO\n");
else
printf("YES\n");
}
int main()
{
while(scanf("%d %d",&n,&m)&&(n+m))
{
Arode *temp;
memset(coun,0,sizeof(coun));
memset(output,0,sizeof(output));
memset(List,0,sizeof(List));
int i,j;
int u,v;
for(i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
coun[v]++;
temp=new Arode;
temp->to=v;
temp->next=NULL;
if(List[u]==NULL)
List[u]=temp;
else
{
temp->next=List[u];
List[u]=temp;
}
}
///拓扑排序函数
Topsort();
///释放邻接表所占的空间
for(j=0;j<n;j++)
{
temp=List[i];
while(temp!=NULL)
{
List[i]=temp->next;
delete temp;
temp =List[i];
}
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/jingttkx/article/details/51334685