雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二分图判断——sgu 172. eXam

Posted on 2011-04-23 10:33  huhuuu  阅读(502)  评论(0编辑  收藏  举报
自己的代码:
用到了STL实现:
把两个二分集合分别保存在两个set容器里
在用queue实现可以对后面有影响的组合先进入set容器
View Code
#include<stdio.h>
#include
<set>
#include
<queue>
#include
<algorithm>
#include
<iostream>
using namespace std;

char hash[209][209];
bool x[30009];

struct data
{
int a,b;
};

int cmp(data x,data y)
{
return x.a<y.a;
}

int main()
{
int n,m;
scanf(
"%d%d",&n,&m);

set <int>set1;
set <int>set2;
queue
<data>qq;
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
hash[i][j]
=0;
}
}
data t;
for(i=0;i<m;i++)
{
int a,b;
scanf(
"%d%d",&a,&b);


t.a
=a;
t.b
=b;
qq.push(t);

}

bool cuo=0;
t
=qq.front();
qq.pop();
set1.insert(t.a);
set2.insert(t.b);
if(t.a==t.b)
{
printf(
"no\n");
return 0;
}
x[t.b]
=1;
while(!qq.empty())
{
t
=qq.front();
qq.pop();
if(set1.find(t.a)!=set1.end()&&set1.find(t.b)!=set1.end())
{
cuo
=1;
break;
}

if(set2.find(t.a)!=set2.end()&&set2.find(t.b)!=set2.end())
{
cuo
=1;
break;
}

if(set1.find(t.a)!=set1.end())
{
if(set2.find(t.b)==set2.end())
{
set2.insert(t.b);
x[t.b]
=1;
}
continue;
}

if(set2.find(t.a)!=set2.end())
{
set1.insert(t.b);
continue;
}

if(set1.find(t.b)!=set1.end())
{
if(set2.find(t.a)==set2.end())
{
set2.insert(t.a);
x[t.a]
=1;
}
continue;
}

if(set2.find(t.b)!=set2.end())
{
set1.insert(t.a);
continue;
}
if(hash[t.a][t.b]<100)//一开始hash[t.a][t.b]==0会错是因为可能要先知道最后一个
{//然后知道最后第二个……只一次就会只考虑到最后一次……开100也只是保守数
hash[t.a][t.b]++;
qq.push(t);
}
else
{
set1.insert(t.a);
set2.insert(t.b);
x[t.b]
=1;
}
}

if(cuo==0)
{
int add=0;
printf(
"yes\n");
for(i=1;i<=n;i++)
{
if(x[i]==0)
add
++;
}
printf(
"%d\n",add);
for(i=1;i<=n;i++)
{
if(x[i]==0)
{
printf(
"%d",i);
break;
}
}
for(i=i+1;i<=n;i++)
{
if(x[i]==0)
printf(
" %d",i);
}
printf(
"\n");
}
else
{
printf(
"no\n");
}
return 0;
}
通用的DFS算法:
View Code
#include <stdio.h>
#include
<iostream>
using namespace std;

const int maxn = 201;
int n, m, color[maxn];
bool g[maxn][maxn];

bool dfs(int now)
{
if(color[now]==-1)color[now]=0;
for(int i=1;i<=n;i++){
if(i==now||!g[i][now])continue;
if(color[i]!=-1&&color[i]==color[now])
return false;
else if(color[i]==-1)
{
color[i]
=(color[now]^1);
if(!dfs(i)) return false;
}
}
return true;
}

int main()
{
scanf(
"%d %d",&n,&m);
int x, y,i;
for(i = 1; i <= n; i++) color[i]=-1;
for(i = 1; i <= m; i++){
scanf(
"%d %d",&x, &y);
g[x][y]
=g[y][x]=true;
}
for(i = 1; i <= n; i++)
{
if(color[i]==-1)
if(!dfs(i))
{
printf(
"no\n");
return 0;
}
}
printf(
"yes\n");
int s=0;
for(i=1;i<=n;i++)if(color[i]==0)s++;
printf(
"%d\n",s);
for(i=1;i<=n;i++)if(color[i]==0){printf("%d",i);break;}
for(i=i+1;i<=n;i++)if(color[i]==0){printf(" %d",i);}
printf(
"\n");
return 0;
}