hdu3342Legal or Not

来源:互联网 发布:淘宝如何发布话费充值 编辑:程序博客网 时间:2024/05/16 23:35

1.题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3342

 

 

2.思路:

       这到题目简单是来说就是判断是否存在拓扑排序,也可以说判断是否存在环。有多种方法(比如用floyd,用dfs判断是否存在环),还有就是最原始的拓扑算法,具体见代码。

 

3.参考代码:

 

#include <stdio.h>#include <string.h>int edge[1100][1100];   ///图的邻接矩阵int rudu[1100];   ///记录入度数int tuopu(int n){   ///拓扑算法int i,j,k;   ///循环变量int cnt=0;   ///统计入度的个数for(i=0;i<n;i++){for(j=0;j<n;j++){if(!rudu[j])   ///如果j没有入度,则入度数减一{rudu[j]--;cnt++;   ///个数加一if(cnt==n)   ///如果两者相等,说明存在环return cnt;for(k=0;k<n;k++)   ///遍历所有的点{if(edge[j][k])   ///相关联的点,入度数减一rudu[k]--;}}}}return cnt;   ///返回个数}int main(){int i,x,y,n,m;while(scanf("%d %d",&n,&m) && (n || m)){memset(edge,0,sizeof(edge));   ///初始化memset(rudu,0,sizeof(rudu));   ///初始化for(i=0;i<m;i++){scanf("%d %d",&x,&y);if(edge[x][y]!=1)   ///考虑是否重边的情况rudu[y]++;edge[x][y]=1;}if(tuopu(n)==n)   ///如果相等说明不能形成环,否则可以puts("YES");elseputs("NO");}return 0;}


 

 

 

原创粉丝点击