Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3566    Accepted Submission(s): 
1395
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define MAX 2010
using namespace std;
int n,k;
vector<int>map[MAX];
char s[MAX];
int vis[MAX];
void getmap()
{
	int i,j;
	for(i=1;i<=n;i++)
	    map[i].clear();
	for(i=1;i<=n;i++)
	{
		scanf("%s",s);
	    for(j=0;j<n;j++)
	    {
	    	if(s[j]==‘1‘)
	    	{
	    		map[i].push_back(j+1);
	    		    vis[j+1]++;
			}
		}
	}
}
void tuopu()
{
	int i,j;
	queue<int>q;
	while(!q.empty())
	    q.pop();
	for(i=1;i<=n;i++)
	    if(vis[i]==0)
	        q.push(i);
	int u,v;
	int ans=0;
	while(!q.empty())
	{
		u=q.front();
		ans++;
		q.pop();
		for(i=0;i<map[u].size();i++)
		{
		    v=map[u][i];
		    vis[v]--;
		    if(vis[v]==0)
		    q.push(v);
		}
	}
	printf("Case #%d: ",k++);
	if(ans!=n)
	printf("Yes\n");
	else
	printf("No\n");
}
int main()
{
	int t,i,j;
	k=1;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		memset(vis,0,sizeof(vis));
	    getmap();
	    tuopu();
	}
	return 0;
}
hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】
原文:http://www.cnblogs.com/tonghao/p/4730926.html