QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#630821 | #5307. Subgraph Isomorphism | xzin | RE | 0ms | 0kb | C++14 | 2.6kb | 2024-10-11 20:33:17 | 2024-10-11 20:33:18 |
answer
#include <bits/stdc++.h>
#define N 101000
#define ull unsigned long long
using namespace std;
vector<int> vec[N];
const ull mask = std::mt19937_64(time(nullptr))();
int d[N], n, m;
int vis[N], vt[N];
vector<int> nd;
ull hs[N];
int t;
void topo() {
queue<int> q;
for(int i = 1;i <= n; i++)
if(d[i] == 1) q.push(i);
while (!q.empty())
{
int p = q.front(); q.pop(); vis[p] = 1;
for(int i = 0; i < vec[p].size(); i++) {
int v = vec[p][i];
d[v]--;
if(d[v] == 1) q.push(v);
}
}
}
ull shift(ull x) {
x ^= mask;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
x ^= mask;
return x;
}
void getHash(int x, int p) {
hs[x] = 1;
for (int i = 0 ; i < vec[x].size(); i++) {
int v = vec[x][i];
if (v == p || vis[v] == 0) continue;
getHash(v, x);
hs[x] += shift(hs[v]);
}
}
void dfs(int p, int fa) {
nd.push_back(p); vt[p] = 1;
for (int i = 0 ; i < vec[p].size(); i++) {
int v = vec[p][i];
if (v == fa || vis[v] == 1 || vt[v]) continue;
dfs(v, p);
}
}
void sl() {
cin>>n>>m; t++;
nd.clear();
for(int i = 0; i <= n; i++) vec[i].clear(), hs[i] = 0, vis[i] = 0, d[i] = 0, vt[i] = 0;
// map<pair<int, int>, bool> mp;
// int mm = m;
for(int i = 1;i <= m; i++) {
int u, v;
cin>>u>>v;
// if(t == 1559) cout<<u<<v;
// if(u > v) swap(u, v);
// if(mp[{u,v}]) {mm--; continue;}
// mp[{u,v}] = 1;
vec[u].push_back(v);
vec[v].push_back(u);
d[u]++; d[v]++;
}
if(m == n - 1) {
cout<<"YES"<<endl;
return;
}
if(m > n) {
cout<<"NO"<<endl;
return;
}
topo();
for(int i = 1;i <= n; i++) {
if(vis[i] == 0) {
if(nd.size() == 0) dfs(i, 0);
getHash(i, 0);
}
}
if(nd.size() % 2) {
for(int i = 1; i < nd.size(); i++) {
if(hs[nd[i]] != hs[nd[i - 1]]) {
cout<<"NO"<<endl;
return;
}
}
}
else {
// if(t == 1559) cout<<n<<endl;
for(int i = 2; i < nd.size(); i++) {
if(hs[nd[i]] != hs[nd[i - 2]]) {
cout<<"NO"<<endl;
return;
}
}
}
cout<<"YES"<<endl;
return;
}
int main() {
int T; cin>>T;
while(T--) sl();
system("pause");
}
/*
1
8 8
1 2
2 3
3 4
1 4
1 5
5 6
3 7
7 8
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Dangerous Syscalls
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 NO YES