Gym

来源:互联网 发布:apache 没有访问权限 编辑:程序博客网 时间:2024/06/12 10:10

https://vjudge.net/contest/186932#problem/C
给定一个图。表示一个王国,给你s,代表你的家乡。
t,代表最开始分裂的城市,如果一个城市,和他邻接的一半城市都分裂了,那么他也要分裂。问你能否使你的家乡分裂。
我感觉,dfs我是不太擅长的qwq。直接广搜也是阔以的。
存一下度数,然后邻接的都减一下度数。就酱紫

#include <bits/stdc++.h>using namespace std;const int maxn=2e5+2000;const int maxm=6e5+2000;int du[maxn];bool vis[maxn];int siz[maxn];int m,n,s,t;struct Node{   int to;    int next;}node[maxm];int head[maxn];int len;void add(int a,int b){    node[len].to=b;    node[len].next=head[a];    head[a]=len++;}void init(){     len=0;     memset(head,-1,sizeof(head));     memset(vis,false,sizeof(vis));     memset(du,0,sizeof(du));     memset(siz,0,sizeof(siz));}void sol(int s){     queue<int>q;     q.push(s);     vis[s]=true;     while(!q.empty()){           int u=q.front();            q.pop();           // cout<<u<<endl;           for(int i=head[u];i!=-1;i=node[i].next){               int to=node[i].to;               du[to]--;           }           for(int i=head[u];i!=-1;i=node[i].next){               int to=node[i].to;                if(du[to]<=siz[to]/2&&vis[to]==false){                    vis[to]=true;                     q.push(to);                }           }     }}int main(){   int a,b;    while(~scanf("%d%d%d%d",&m,&n,&t,&s)){          init();          for(int i=0;i<n;i++){              scanf("%d%d",&a,&b);              add(a,b);              add(b,a);              du[a]++,du[b]++;          }          for(int i=1;i<=m;i++){              siz[i]=du[i];          }          sol(s);          if(vis[t])                puts("leave");          else                puts("stay");    }    return 0;}
原创粉丝点击