HDU 4324 Contest 3

直接DFS即可

#include <iostream>
#include <string.h>
#include <algorithm>
#include <cstdio>

using namespace std;

bool vis[2010];

char map[2010][2010];

struct e{
	int u,v;
	int next;
}edge[2050000];
int head[2010],tot;

void addedge(int u,int v){
	edge[tot].u=u;
	edge[tot].v=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}

bool dfs(int now,int parent){
	vis[now]=true;
	for(int e=head[now];e!=-1;e=edge[e].next){
		if(vis[edge[e].v]){
			if(map[edge[e].v][parent]=='1')
			return true;
		}
		else{
			if(dfs(edge[e].v,now)){
				return true;
			}
		}
	}
	return false;
}

int main (){
	int T,n,kase=0;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		getchar();
		memset(head,-1,sizeof(head));
		memset(vis,false,sizeof(vis));
		tot=0;
		for(int i=0;i<n;i++){
			gets(map[i]);
			for(int j=0;j<n;j++){
				if(map[i][j]=='1'){
					addedge(i,j);
				}
			}
		}
		bool flag=false;
		for(int i=0;i<n;i++){
			if(!vis[i]){
		 		flag=dfs(i,-1);
				if(flag)
				break;
			}
		}
		if(flag) printf("Case #%d: Yes
",++kase);
		else printf("Case #%d: No
",++kase);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4085830.html