C Brexit(vector-BFS)

题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意:给出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结合,小开心以后多加使用。
大佬告诉我这个题也可以用邻接表存放数据……
发布了90 篇原创文章 · 获赞 18 · 访问量 3344

猜你喜欢

转载自blog.csdn.net/sherry_zhen/article/details/103940114
今日推荐