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
- hdu 5215 Cycle (图论,盘环)
- hdu 5215 Cycle
- hdu 5215 Cycle
- HDU 5215 Cycle (搜索)
- HDU 5215 Cycle --- 奇偶环的判定
- HDU 5782 Cycle
- HDU 5215 Cycle(判定无向图奇偶环)
- HDU - 5215 Cycle(奇圈和偶圈)
- HDU 1700 Points on Cycle
- HDU-1700 Points on Cycle
- hdu 5215 Cycle(判断是否有奇数偶数的环)
- [二分图染色判奇偶换 || 并查集] HDU 5215 Cycle
- HDOJ 5215 Cycle
- 图论- hdu5215 Cycle
- hdu 1700 Points on Cycle 水几何
- hdu 1700 Points on Cycle(几何)(中等)
- [HDU 5782] Cycle (bitset优化+脑洞)
- HDU 5782 Cycle(后缀数组+bitset)
- 详解java定时任务
- HTML5标签属性及用法(二)
- Settings中的xml中的值与SettingsProvider中default.xml中的值的区别
- 根运动 (Root Motion) – 工作原理
- SSh结合Easyui实现Datagrid的分页显示
- hdu 5215 Cycle (图论,盘环)
- usbip 试用记
- android 仿知乎sildmenu实现
- Linux 多线程同步之消息队列
- oracle 分页
- 做web前端的感悟
- 支持“OdeToFoodDb”上下文的模型已在数据库创建后发生更改
- ActiveMQ入门实例
- 瓦力模型主体完工