hdu4324

/*
分析:
    拓扑排序。
    深搜啊什么的都行。


                             2012-12-13
*/








#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
#define N 2011
using namespace std;

int n;
char map[N][N];
int indegree[N];

struct Eage{
	int from,to,next;
}eage[N*N/2];
int tot,head[N];
void add(int a,int b){
	eage[tot].from=a;eage[tot].to=b;eage[tot].next=head[a];head[a]=tot++;
}

void get_map()
{
	int i,l;
	tot=0;
	memset(head,-1,sizeof(head));
	memset(indegree,0,sizeof(indegree));
	for(i=0;i<n;i++)
	{
		scanf("%s",&map[i]);
		for(l=0;map[i][l];l++)	if(map[i][l]=='1')	{add(i,l);indegree[l]++;}
	}
}
int topsort()
{
	int i,j;
	int k=0;
	int flag;
	while(k<n)
	{
		flag=0;
		for(i=0;i<n;i++)
		{
			if(indegree[i])	continue;
			k++;
			flag=1;
			indegree[i]--;
			for(j=head[i];j!=-1;j=eage[j].next)	indegree[eage[j].to]--;
		}
		if(!flag)	return 1;
	}
	return 0;
}
int main()
{
	int T,Case;
	int ans;
	scanf("%d",&T);
	for(Case=1;Case<=T;Case++)
	{
		scanf("%d",&n);
		get_map();
		ans=topsort();
		if(ans)	printf("Case #%d: Yes\n",Case);
		else	printf("Case #%d: No\n",Case);
	}
	return 0;
}


你可能感兴趣的:(hdu4324)