題目:http://acm.hdu.edu.cn/showproblem.php?pid=3478
註:
二分圖的判定(染色法)
二分圖與奇環的關係:
如果一圖是二分圖,那麼它一定沒有奇環。如果一圖沒有奇環的話,那麼它可以是二分圖。
原始碼:
#include <stdio.h>#include <string.h>#define N 120000#define M 1020000typedef struct{ int v,nxt;}node;node e[M];int head[N],f[N],d[N];int n,m,s,id,u,v;int flag,cas,t;void add(int u,int v){ e[id].v=v; e[id].nxt=head[u]; head[u]=id; id++; e[id].v=u; e[id].nxt=head[v]; head[v]=id; id++;}int dfs(int i) //白色 -1 黑色 1{ int se,u; if(flag==0) return 0; for(int x=head[i];x!=0;x=e[x].nxt) { u=e[x].v; se=-f[i]; if(f[u]!=0) { if(se!=f[u]) { flag =0; return 0;} } else { f[u]=se; dfs(u); } } return 1;}int main(){ //freopen("D:\\a.txt","r",stdin); scanf("%d",&cas); t=0; while(t<cas) { t++; scanf("%d %d %d",&n,&m,&s); for(int i=0;i<n;i++) head[i]=0; for(int i=1;i<=2*m;i++) e[i].nxt=0; id=1; memset(d,0,sizeof(d)); for(int i=0;i<m;i++) { scanf("%d %d",&u,&v); d[u]++; d[v]++; add(u,v); } flag=0; for(int i=0;i<n;i++) if(d[i]==0) { printf("Case %d: NO\n",t); flag=1; break; } if(flag) continue; memset(f,0,sizeof(f)); flag=1; f[s]=1; dfs(s); if(flag==0) printf("Case %d: YES\n",t); else printf("Case %d: NO\n",t); }}