题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4324
思路:dfs搜索即可,如果当前点u的下一个点v已经访问过了,那么就判断dist[u]==dist[[v]+2,成立返回true,否则更新dist[v]=dist[u]+1,继续深搜。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 2222 8 vector<int>vet[MAXN]; 9 char str[MAXN]; 10 int dist[MAXN]; 11 bool mark[MAXN]; 12 int n; 13 14 bool dfs(int u) { 15 mark[u]=true; 16 for(int i=0; i<vet[u].size(); i++) { 17 int v=vet[u][i]; 18 if(mark[v]&&dist[u]==dist[v]+2) { 19 return true; 20 } else if(!mark[v]) { 21 dist[v]=dist[u]+1; 22 if(dfs(v))return true; 23 } 24 } 25 return false; 26 } 27 28 29 int main() { 30 // freopen("1.txt","r",stdin); 31 int _case,t=1; 32 scanf("%d",&_case); 33 while(_case--) { 34 scanf("%d",&n); 35 for(int i=1; i<=n; i++)vet[i].clear(); 36 for(int i=1; i<=n; i++) { 37 scanf("%s",str+1); 38 for(int j=1; j<=n; j++) { 39 if(str[j]=='1')vet[i].push_back(j); 40 } 41 } 42 memset(dist,0,sizeof(dist)); 43 memset(mark,false,sizeof(mark)); 44 bool flag=false; 45 for(int i=1; i<=n; i++) { 46 if(vet[i].size()) { 47 if(dfs(i)) { 48 flag=true; 49 break; 50 } 51 } 52 } 53 printf("Case #%d: ",t++); 54 flag?puts("Yes"):puts("No"); 55 } 56 return 0; 57 }