hdu 5215 Cycle (图论,盘环)

来源:互联网 发布:吉喆对麦迪摇手指知乎 编辑:程序博客网 时间:2024/06/05 06:17

题意:

给出一个无向图,问是否存在奇环和偶环。

题解:

首先奇环判断比较简单,如果是二分图必定没有奇环,否则必定有奇环。

接着是偶环的判断,偶环比较复杂点,对于一个双联通分量,分两种情况:

1、如果双联通分量就是一个环,那么就可能为奇环也可能为偶环,要特判。

2、如果双联通分量不是一个环,那么肯定存在偶环在里面。

对于1,我的做法是对每个双联通分量进行搜索,记录点被走过大于1的个数,有多个点被走过的次数超过1那么肯定存在共享同一个点的环,那么这种情况属于2,那么肯定有偶环!如果只有一个点被走过的次数超过1,那么肯定只有一个环,这个换肯定是就这连通分量,于是只要判断这个连通分量也就是这个环的点数就能知道是奇环还是偶环了!

#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>#define B(x) (1<<(x))using namespace std;typedef long long ll;void cmax(int& a,int b){ if(b>a)a=b; }void cmin(int& a,int b){ if(b<a)a=b; }void cmax(ll& a,ll b){ if(b>a)a=b; }void cmin(ll& a,ll b){ if(b<a)a=b; }void add(int& a,int b,int mod){ a=(a+b)%mod; }void add(ll& a,ll b,ll mod){ a=(a+b)%mod; }const int oo=0x3f3f3f3f;const int MOD=1000000007;const double eps = 1e-8;const int maxn = 100005;const int maxm = 300005;struct EDGE{    int v,next;}E[maxm << 1];int head[maxn],tol;int low[maxn],dfn[maxn],instack[maxn],Stack[maxn];int id[maxn],vis[maxm << 1],col[maxn],Q[maxm],f,r;int cnt[maxn],num[maxn],s[maxn];int g_cnt,ID,top,n;void Init(){    memset(head,-1,sizeof head);    memset(low,0,sizeof low);    memset(dfn,0,sizeof dfn);    memset(instack,0,sizeof instack);    memset(vis,0,sizeof vis);    g_cnt=ID=tol=top=0;}void add_edge(int u,int v){    E[tol].v=v;    E[tol].next=head[u];    head[u]=tol++;}void Tarjan(int u){    dfn[u]=low[u]=++g_cnt;    Stack[++top]=u;    instack[u]=1;    int v;    for(int i=head[u];i!=-1;i=E[i].next){        v=E[i].v;        if(vis[i])continue;        vis[i]=vis[i^1]=1;        if(!dfn[v]){            Tarjan(v);            if(low[v]<low[u])                low[u]=low[v];        }else if(instack[v]&&dfn[v]<low[u])            low[u]=dfn[v];    }    if(dfn[u]==low[u]){        ID++;        do{            v=Stack[top--];            instack[v]=0;            id[v]=ID;        }while(u!=v);    }}bool had_odd(){    memset(col,-1,sizeof col);    for(int i=1;i<=n;i++){        if(col[i]!=-1)continue;        col[i]=1;        f=r=0;        Q[r++]=i;        while(f<r){            int u=Q[f++];            for(int i=head[u];i!=-1;i=E[i].next){                int v=E[i].v;                if(col[u]==col[v]) return true;                else if(col[v]==-1){                    col[v]=1-col[u];                    Q[r++]=v;                }            }        }    }    return false;}int Count;void dfs(int u, int index){    cnt[u]++;    if(cnt[u]>1)Count++;    for(int i=head[u];i!=-1;i=E[i].next){        int v=E[i].v;        if(vis[i]) continue;        vis[i]=vis[i^1]=1;        if(id[v]!=index) continue;        dfs(v, index);    }}bool had_even(){    for(int i=1;i<=n;i++)        if(!dfn[i])            Tarjan(i);    //printf("ID=%d\n",ID);    if(ID==0)return false;    memset(cnt,0,sizeof cnt);    memset(vis,0,sizeof vis);    memset(num,0,sizeof num);    memset(s,0,sizeof s);    for(int i=1;i<=n;i++){        s[id[i]]=i;        num[id[i]]++;    }    for(int i=1;i<=ID;i++){        Count=0;        dfs(s[i],i);        //printf("fuck: %d %d\n",Count,num[i]);        if(num[i]==1)continue;        if(!(Count==1 && num[i]%2==1)) return true;    }    return false;}int main(){    //freopen("E:\\read.txt","r",stdin);    int T,m,u,v;    scanf("%d", &T);    while(T--){        Init();        scanf("%d %d",&n,&m);        for(int i=1;i<=m;i++){            scanf("%d %d",&u,&v);            add_edge(u,v);            add_edge(v,u);        }        if(had_odd()) puts("YES");        else puts("NO");        if(had_even()) puts("YES");        else puts("NO");    }    return 0;}/*25 61 22 33 13 53 45 45 61 22 12 33 23 43 5*/



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁的宝宝不吃奶粉怎么办 小孩不爱吃饭怎么办吃什么药 小孩这几天不爱吃饭怎么办 宝宝这几天不爱吃饭怎么办 想看书看不进去怎么办 宝宝3岁不爱看书怎么办 4岁宝宝不爱看书怎么办 1岁宝宝不爱看书怎么办 孩子一看书就哭怎么办 我不想读大专了怎么办 一年级的小孩不爱学习怎么办 高中的孩子不爱学习怎么办 9个月宝宝肠胃不好怎么办 孩子高烧过后干呕不爱吃饭怎么办 母乳涨奶发烧了怎么办 涨奶发烧了怎么办啊 2岁宝贝不吃饭怎么办 4个月的婴儿厌食怎么办 2个月婴儿厌食怎么办 3个月宝宝厌奶怎么办 没胃口吃不下饭怎么办 小孩吃多了积食怎么办 孩子吃撑了难受怎么办 卵巢早衰月经量少怎么办 7岁孩吃饭少消瘦怎么办 宝宝3岁不吃饭怎么办 小孩吃多了吐了怎么办 6岁儿童越来越瘦怎么办 7岁儿童不吃饭怎么办 天热宝宝不好好吃饭怎么办 天热宝宝不爱吃饭怎么办 天热宝宝不想吃饭怎么办 夏天天热宝宝不爱吃饭怎么办 3岁宝宝吃饭不香怎么办 胃ca吃饭反胃没食欲怎么办 12岁儿童脸色发黄怎么办 胃饿 但是没食欲不想吃饭怎么办 牙缝大经常塞西怎么办 吃肉老是塞牙缝怎么办 宝宝光喝奶粉不吃饭怎么办 九个月宝宝缺维c怎么办