题目大意:
Brexit 外国人的梗。。。
Britain exiting from the EU
就是说有编号为L的国家将退出欧盟,如果一个国家的伙伴中有不少于一半都要脱欧的话,那么这个国家也会离开欧盟。
求编号为x的国家会不会离开欧盟。
tho:一开始以为这可能又是个图论割点什么的题,貌似可能很难。就不自觉的咸鱼,在最后半小时发现这是搜索。
然后对这类前向星的题不是太熟悉,最后几分钟改了几发。。。慌了。分析能力待提升。
从第一个脱欧的国家开始BFS搜,有三个数组记录, 一个cnt记录该点有多少伙伴,一个num记录该点将脱欧的伙伴,vis标记。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3f3f
#define ms(x) memset(x,0,sizeof(x))
#define mf(x) memset(x,-1,sizeof(x))
using namespace std;
const int N = 200002;
const int nEdge = 300005;
struct Edge
{
int u, v, next;
} edge[nEdge];
int head[N],tot;
int cnt[N], vis[N], leave[N];
int n,m,my,l;
void addEdge(int u, int v)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void init()
{
mf(head);
ms(leave);
ms(cnt);
ms(vis);
tot = 0;
}
void bfs(int &flag)
{
queue<int>q;
vis[l] = 1;
cnt[l] = 0;
q.push(l);
while(!q.empty())
{
int x = q.front();
q.pop();
for(int i = head[x]; i!=-1; i=edge[i].next)
{
if(edge[i].u == my) flag=0;
int v = edge[i].v;
leave[v]++;
if(leave[v]*2>=cnt[v] && !vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
int main()
{
while(cin>>n>>m>>my>>l)
{
init();
for(int i=0; i<m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
addEdge(x,y);
addEdge(y,x);
cnt[x]++;
cnt[y]++;
}
int flag=1;
bfs(flag);
if(flag) printf("stay\n");
else printf("leave\n");
}
return 0;
}