QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#107048 | #5307. Subgraph Isomorphism | SmallBlack | WA | 0ms | 5976kb | C++14 | 2.3kb | 2023-05-20 09:47:50 | 2023-10-15 17:25:21 |
Judging History
answer
// Problem: D - Subgraph Isomorphism
// Contest: Virtual Judge - 过什么520做题要紧
// URL: https://vjudge.net/contest/559671#problem/D
// Memory Limit: 1024 MB
// Time Limit: 3000 ms
// Date:2023-05-20 07:53:15
// By:SmallBlack
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long s=0,k=1;
char c=getchar();
while(!isdigit(c))
{
k=(c=='-')?-1:1;
c=getchar();
}
while(isdigit(c))
{
s=s*10+c-'0';
c=getchar();
}
return s*k;
}
#define d read()
#define ll long long
#define ull unsigned long long
#define Maxn 10010
#define Size 100010
#define mp make_pair
#define pb push_back
#define fi first
#define se second
vector<ll>e[Size];
vector<ll>st,loop,LP;
bool ins[Size],fin=0;
void dfs(ll u,ll fa)
{
ins[u]=1,st.pb(u);
for(auto v:e[u])
{
if(v==fa) continue;
if(ins[v])
{
while(st.back()!=v)
{
loop.pb(st.back());
st.pop_back();
}
loop.pb(v);
fin=1;
return;
}
dfs(v,u);
if(fin) return;
}
st.pop_back(),ins[u]=0;
}
ull mask;
ull shift(ull x)
{
x=x^mask^((x^mask)<<13),x^=x>>7,x^=x<<17;
return x^mask;
}
ull tag[Size];
void Hash(ll u,ll fa)
{
tag[u]=1;
for(auto v:e[u])
{
if(v==fa||ins[v]) continue;
Hash(v,u);
tag[u]+=shift(tag[v]);
}
}
ll t;
void solve()
{
ll n=d,m=d;
mask=std::chrono::steady_clock::now().time_since_epoch().count()*(n+m);
for(int i=1;i<=n;i++) e[i].clear(),ins[i]=0,tag[i]=0;
for(int i=0;i<m;i++)
{
ll x=d,y=d;
e[x].pb(y),e[y].pb(x);
}
if(m==n-1) return (void)puts("YES");
else if(m>n) return (void)puts("NO");
fin=0,st.clear(),loop.clear(),dfs(1,0);
for(int i=1;i<=n;i++) ins[i]=0;
for(auto x:loop) ins[x]=1;
if(loop.size()==n) return (void)puts("YES");
LP.clear();
for(int i=0;i<loop.size();i++)
if(e[loop[i]].size()>2) Hash(loop[i],0),LP.pb(i);
// if(LP.size()<2) return (void)puts("NO");
if(LP[1]-LP[0]>2) return (void)puts("NO");
// if(LP[0]+loop.size()-LP[LP.size()-1]!=LP[1]-LP[0])
// return (void)puts("NO");
for(int i=2;i<LP.size();i++)
if(LP[i]-LP[i-1]!=LP[1]-LP[0])
return (void)puts("NO");
for(int i=1;i<LP.size();i++)
if(tag[loop[LP[i]]]!=tag[loop[LP[0]]])
return (void)puts("NO");
puts("YES");
}
int main()
{
t=d;
while(t--) solve();
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 5976kb
input:
4 7 6 1 2 2 3 3 4 4 5 5 6 3 7 3 3 1 2 2 3 3 1 5 5 1 2 2 3 3 4 4 1 1 5 1 0
output:
YES YES YES YES
result:
wrong answer expected NO, found YES [3rd token]