[SCU 4522] 寻找fly真迹 (脑洞+构造)

来源:互联网 发布:程序员猝死的原因 编辑:程序博客网 时间:2024/04/28 13:47

SCU - 4522

给定一个只含小写 a、b、c的字符串
其中每个字母和字典序相等和相邻的字母相连
给出连好边的一张图,问是否是一个合法状态


首先 b和所有字母都连上了边,
所以图中与所有字母连上边的都是 b,可以先去掉
然后整张图就变成了两个联通块,一个是 a的,一个是 b的
并且每个联通块都是完全图
判断一下是不是两个联通块,是不是两个完全图就好了

#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <map>#include <set>#include <queue>using namespace std;typedef pair<int,int> Pii;typedef long long LL;typedef unsigned long long ULL;typedef double DBL;typedef long double LDBL;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define Sqr(a) (a*a)const int maxn=500+10, maxm=maxn*maxn;struct Graph{    int ndn,edn,last[maxn];    int u[2*maxm],v[2*maxm],nxt[2*maxm];    void init(int a){ndn=a; edn=0; MST(last,-1);}    void adde(int tu,int tv)    {        u[edn]=tu; v[edn]=tv;        nxt[edn]=last[tu];        last[tu]=edn++;    }};int N,M;Graph G;int deg[maxn];int ban[maxn];int bsiz[10];int main(){    #ifdef LOCAL    freopen("in.txt", "r", stdin);//  freopen("out.txt", "w", stdout);    #endif    int T;    scanf("%d", &T);    for(int ck=1; ck<=T; ck++)    {        scanf("%d%d", &N, &M);        G.init(N);        CLR(deg); CLR(ban); CLR(bsiz);        for(int i=0; i<M; i++)        {            int u,v;            scanf("%d%d", &u, &v);            G.adde(u,v); G.adde(v,u);            deg[u]++; deg[v]++;        }        for(int u=1; u<=N; u++) if(deg[u]==N-1) ban[u]=-1;        int bcnt=0;        for(int i=1; i<=N; i++)        {            if(ban[i]) continue;            else            {                bcnt++;                if(bcnt>2) break;                int tot=0;                queue<int> que;                que.push(i);                ban[i]=bcnt;                while(que.size())                {                    int u=que.front(); que.pop();                    tot++;                    for(int e=G.last[u]; ~e; e=G.nxt[e])                    {                        int v=G.v[e];                        if(!ban[v])                        {                            que.push(v);                            ban[v]=bcnt;                        }                        if(ban[v]==-1) deg[u]--;                    }                }                bsiz[bcnt]=tot;            }        }        if(bcnt>2) puts("No");        else        {//          for(int i=1; i<=N; i++) printf("%d ", ban[i]); puts("");//          for(int i=1; i<=N; i++) if(~ban[i]) printf("%d ", deg[i]); puts("");//          for(int i=1; i<=bcnt; i++) printf("%d ", bsiz[bcnt]); puts("");            bool ok=1;            for(int i=1; i<=N; i++)            {                if(ban[i]>0 && deg[i]!=bsiz[ban[i]]-1) {ok=0; break;}            }            if(ok) puts("Yes");            else puts("No");        }    }    return 0;}
0 0
原创粉丝点击