| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1363505 | hsuan._.0528 | Social Engineering (EGOI22_socialengineering) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<int, int>
#define F first
#define S second
const int maxn =5e5+10;
const int mod=1e9+7;
int dp[20][100000];
vector<pii> v[maxn];
int dfs(int x, int mask){
if(dp[x][mask] != -1) return dp[x][mask];
bool b=0;
if(x==1){
for(auto[y, id]: v[x]){
if( ((1<<id) & mask) == 0){
if( dfs(y, ((1<<id) | mask) ) == 1) b=1;
}
}
}else{
b=1;
for(auto[y, id]: v[x]){
if( ((1<<id) & mask) == 0){
if( dfs(y, ((1<<id) | mask) ) == 0) b=0;
}
}
}
dp[x][mask]=b;
return b;
}
void MakeMove(int v);
int GetMove();
void SocialEngineering(int n, int m, vector<pair<int,int>> edges){
for(int i=0; i<m; i++){
v[ edges[i].F ].push_back( {edges[i].S, i} );
v[ edges[i].S ].push_back( {edges[i].F, i} );
}
memset(dp, -1, sizeof(dp));
if (dfs(1, 0) == 1) {
return;
}
int cur=1, mask=0;
while(true){
int a=GetMove();
for(auto[y, id] : v[1]){
if(y==a){
mask |= (1<<id);
break;
}
}
cur=a;
if(cur==0) return;
for(auto[y, id]: v[cur]){
if( ((1<<id) & mask) == 0)
if( dfs(y, ((1<<id) | mask) ) == 0){
cur=y; mask = ((1<<id) | mask);
break;
}
}
MakeMove(cur);
while(cur!=1){
for(auto[y, id]: v[cur]){
if( ((1<<id) & mask) == 0)
if( dfs(y, ((1<<id) | mask) ) == 0){
cur=y; mask = ((1<<id) | mask);
break;
}
}
MakeMove(cur);
}
}
}
/*
signed main(){
//ios_base::sync_with_stdio(0); cin.tie(0);
return 0;
}*/