B. 我觉得海星
题意:
一个无向图,判断是否含有五元环。T 组数据,n 个点。 T<=100, n<=200 。
tags:
一开始想 dfs,发现搞不出来。赛后听大佬们bb,原来可以 bitset 水过去 。
bitset<1000> bit[i][j] 存 i -> { k1,k2... } -> j ,也就是点 i 经过一个点可以点 j 的集合。
然后枚举一条边 i -> j ,再枚举一个点 k ,看是否有 k -> x1 -> i 和 k -> x2 -> j 。
复杂度 O(T * n^3 / 32) 。
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi first
#define se second
typedef long long ll;
const int N = 205;
int n;
char s[N][N];
bitset<N> bit[N][N];
void Init() {
rep(i,0,N-1) rep(j,0,N-1) bit[i][j].reset();
}
bool solve() {
bitset<N> bi, bj, bb;
rep(i,1,n) rep(j,1,n) if(j!=i && s[i][j]=='1')
rep(k,1,n) if(k!=i && k!=j)
{
bi=bit[k][i], bj=bit[k][j];
bi.reset(j), bj.reset(i);
if(bi.count()==0 || bj.count()==0) continue;
bb = bi|bj;
if(bb.count()>1) return true;
}
return false;
}
int main()
{
int T; scanf("%d", &T);
rep(cas, 1, T)
{
Init();
scanf("%d", &n);
rep(i,1,n) scanf("%s", s[i]+1);
rep(i,1,n) rep(j,1,n) if(j!=i)
rep(k,1,n) if(k!=i && k!=j && s[i][k]=='1' && s[j][k]=='1')
{
bit[i][j].set(k);
}
printf("Case #%d: ", cas);
if(solve()) puts("Starfish!");
else puts("Walk Walk");
}
return 0;
}