机试算法讲解: 第39题 DAG之QQ师徒关系

来源:互联网 发布:ahc官网扫码软件 编辑:程序博客网 时间:2024/06/11 09:44
/*问题:QQ群中师徒关系。判定是否存在有向无环图。输入:N(多少个结点),M(需要测试的关系) (2<=N,M<=100),接下来是M行,每一行是 x y,表示x是y的师傅,当N=0时,输入终止,数字时0,1,...,N-1输出:合法师徒为"YES",非法是"NO"思路:采用队列保存入度为0的节点,每找到一个,删除该节点和以该节点为弧尾的所有节点*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <queue>#include <vector>#define MAX 1000using namespace std;int main(int argc,char* argv[]){int n,m;int i;while(EOF!=scanf("%d %d",&n,&m)){if(0==n && 0==m){break;}vector<int> vecEdge[MAX];//用于建立单链表int inDegree[MAX];queue<int> queueDegree;//用于存放入度为0的结点//初始化入度为0for(i = 0 ; i < n ; i++){inDegree[i] = 0;}//获取输入信息int x,y;for(i = 0 ; i < m ; i++){scanf("%d %d",&x,&y);//对入度进行加1,同时建立链表关系inDegree[y]++;vecEdge[x].push_back(y);}//将入度为0的节点存入队列中queue<int> queInDegree;for(int i = 0 ; i < n ; i++){if(0==inDegree[i]){queInDegree.push(i);}}//遍历入度为0的节点,开始进行删除操作int iCnt = 0;//用于计数是否最终删除了n个节点while(!queInDegree.empty()){int iFront = queInDegree.front();//遍历该节点,将所有与之相关的节点的入度减1for(i = 0 ; i < vecEdge[iFront].size() ; i++){int iRel = vecEdge[iFront][i];inDegree[iRel]--;//如果减1后的节点的入度为0,则再将该节点放入队列中if(0==inDegree[iRel]){queInDegree.push(iRel);}}//在队列中弹出该节点queInDegree.pop();//删除该节点对应的单链表vecEdge[iFront].clear();iCnt++;}//如果删除了所有的节点,表明是有向无环图if(n==iCnt){printf("YES\n");}else{printf("NO\n");}}system("pause");getchar();return 0;}

0 0
原创粉丝点击