标签:
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