hdu3342--拓扑排序

hdu3342--拓扑排序
感谢杭电的水题,A水题,涨自信!
题意描述:
给出M组两个人之间的师徒关系,问是否存在悖论,即某个人的徒弟又是自己的师傅。
解题思路:
用拓扑排序判断图中是否存在环路即可。
拓扑排序参阅: http://www.cppblog.com/hoolee/archive/2012/08/16/187400.html
以下是本题代码:

#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define LEN 110
int mp[LEN][LEN];
int d[LEN];
int s[LEN];
int N, M;
int zr;
int findZero()
{
    
int i;
    
int a = -1;
    
for(i = 0; i < N; i++)
        
if(s[i] == 0 && d[i] == 0)
        {
            a 
= i;
            
break;
        }
    
if(a == -1)
        
return 0;
    zr 
= a;
    
return 1;    
    
}
int TopSort()
{
    
int i, j;
    
for(i = 0; i < N; i++)
    {
        
if(findZero())
        {
            s[zr] 
= 1;
            
for(j = 0; j < N; j++)
                d[j] 
-= mp[zr][j];
        }
        
else 
            
return 0;//如果点还没有选完,且已经找不到入度为0的点,说明图中存在回路
    }
    
return 1;
}
int main()
{
    
int i, j;
    
int x, y;
    
while(scanf("%d%d"&N, &M), N)
    {
        memset(mp, 
0sizeof(mp));
        memset(s, 
0sizeof(s));
        memset(d, 
0sizeof(d));
        
for(i = 0; i < M; i++)
        {
            scanf(
"%d%d"&x, &y);
            
if(mp[x][y] == 0)
            {
                mp[x][y] 
= 1;
                d[y]
++;
            }
        }
        
if(TopSort() == 1)
            printf(
"YES\n");
        
else
            printf(
"NO\n");
    }
    
//system("pause");
}

你可能感兴趣的:(hdu3342--拓扑排序)