hdu 4324(dfs)

题目链接: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 }
View Code

 

 

你可能感兴趣的:(HDU)