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\n",++kase);
else printf("Case #%d: No\n",++kase);
}
return 0;
}

浙公网安备 33010602011771号