3 20 11 22 20 11 00 0 Sample OutputYESNO 题目大意:给你n个人和m组关系,关系表示为 a b 表示a是b的主人 ,每个人可能有多个主人也可能有多个下属问你m个关系是否存在矛盾
题目思路:
直接拓扑排序判断是否有矛盾,拓扑排序为先从入度为0的点查询如果子节点入度为1然后入队列,子节点入度减一,如果最后访问到的点数为n则说明不存在矛盾否则存在
AC代码:
#include<cstring>#include<cstdio>#include<queue>#include<vector>using std::queue;using std::vector;const int maxn = 1e2+10;int cnt[maxn];vector<int>edge[maxn];int n,m;void topsort(){ //拓扑排序 queue<int>q; for(int i=0;i<n;i++){ if(cnt[i]==0)q.push(i); //首先从入度为0的点开始 } int num = 0; while(!q.empty()){ int u = q.front(); q.pop(); num++; int len = edge[u].size(); for(int i=0;i<len;i++){ int v = edge[u][i]; if(cnt[v]==1)q.push(v); //子节点入度为1的入队 cnt[v]--; } } if(num==n)puts("YES"); //访问的点数==n else puts("NO");}int main(){ while(~scanf("%d%d",&n,&m),n+m){ memset(cnt,0,sizeof(cnt)); memset(edge,0,sizeof(edge)); while(m--){ int u,v;scanf("%d%d",&u,&v); edge[u].push_back(v); //建图 cnt[v]++; //记录点的度数 } topsort(); } return 0;}
新闻热点
疑难解答