http://acm.hdu.edu.cn/showproblem.php?pid=4324
/* 搜索一个三角形,用vector+vis来减少复杂度 */ /************************************************ * Author :Powatr * Created Time :2015-8-25 10:42:01 * File Name :E.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int MAXN = 2000 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; char mp[MAXN][MAXN]; int vis[MAXN][MAXN]; int n; vector<int> G[MAXN]; bool dfs(int x, int y, int step, int ex, int ey) { if(step == 2 && y == ex) return true; if(vis[x][y]) return false; vis[x][y] = 1; if(step >= 2) return false; for(int i = 0; i < G[y].size(); i++){ int v = G[y][i]; // printf("%d %d ", y, v); if(!dfs(y, v, step + 1, ex, ey)); else return true; } return false; } bool solve() { for(int i = 1; i <= n; i++) for(int j = 0; j < G[i].size(); j++){ int v = G[i][j]; if(!vis[i][v]) if(dfs(i, v, 0, i, v)){ return true; } } return false; } int main(){ int T; scanf("%d", &T); for(int cas = 1; cas <= T; cas++){ memset(vis, 0, sizeof(vis)); scanf("%d", &n); for(int i = 0; i <= n; i++) G[i].clear(); for(int i = 1; i <= n; i++) scanf("%s", mp[i] + 1); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(mp[i][j] == '1'){ G[i].push_back(j); } } } printf("Case #%d: ", cas); if(solve()) puts("Yes"); else puts("No"); } return 0; }