HDU5154 - Harry and Magical Computer : http://acm.hdu.edu.cn/showproblem.php?pid=5154
还是拓补排序,直接上代码了.
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN = 105; int Map[MAXN][MAXN],In[MAXN],flag; int N,M; int x,y; void Initial() { flag = 0; memset(Map,0,sizeof(Map)); memset(In,0,sizeof(In)); } void TopoSort() { int x; queue<int>ans; for(int i = 1;i <= N;i++) if(!In[i])ans.push(i);//入度为零的点进入队列 while(!ans.empty()) { x = ans.front(); ans.pop(); for(int i = 1;i <= N;i++) { if(Map[x][i]) { // In[i]--,Map[x][i] = 0; In[i] -= Map[x][i],Map[x][i] = 0; if(!In[i])ans.push(i); } } } for(int i = 1;i <= N;i++) { if(In[i])//还存在入度大于零的点 { flag = 1; break; } } if(flag)printf("NO\n"); else printf("YES\n"); } int main() { while(~scanf("%d%d",&N,&M)) { Initial(); while(M--) { scanf("%d%d",&x,&y); In[x]++;//注意是x的入度加一 Map[y][x]++; // Map[y][x] = 1; } TopoSort(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 00:32:34