题目
题意:给出c,p,x,l代表给出c个部落,有p个联盟关系,x代表目标部落,l是最先脱离的部落。接下来有p行,每行输入a,b代表a,b有联盟关系;
部落脱离部条件是建立联盟的伙伴>=一半的脱离。
询问:x最后如果能脱离联盟输出leave,否则输出stay;
思路:建立图,因为题目的数据为2e5,建立二维矩阵开不了vis[2e5][2e5]的空间;用vector存放联盟关系,并用du[i]记录i的度数,go[i]记录与i相连要离开的部落,用BFS跑一遍判断x部落是否脱离部落即可;
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
vector<int>G[maxn];
int du[maxn];
int go[maxn];
int vis[maxn];
int main()
{
int c,p,x,l;
cin>>c>>p>>x>>l;
for(int i=1; i<=p; i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);//vector G[u]=v;
G[v].push_back(u);//vector G[v]=u;
du[u]++;
du[v]++;
}
queue<int>q;//建立队列
q.push(l);//进入队列即代表脱离
vis[l]=1;//=1代表已经脱离
int flag=1;
while(!q.empty())
{
int k=q.front();//获取队首元素
q.pop();//弹出队首元素
if(k==x)//代表访问到x
{
flag=0;
printf("leave\n");
break;
}
for(int i=0; i<(int)G[k].size();i++)//检查与队首元素相连的部落是否满足脱离条件
{
int d=G[k][i];
go[d]++;
if(go[d]*2>=du[d]&&vis[d]==0)//满足条件脱离离开同时未被访问
{
q.push(d);//入队列
vis[d]=1;//被访问过
}
}
}
if(flag==1)
printf("stay\n");
return 0;
}
注:这是第一次学会用vector解题与BFS结合,小开心以后多加使用。
大佬告诉我这个题也可以用邻接表存放数据……