您的位置:首页 > 其它

hdu 5285(染色法判断二分图)

2016-07-15 22:13 405 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5285

解题思路:很明显的是二分图的判定,用染色法即可。

不过这题有一个坑,当n<=1和m=0时要特判,这里WA了好久。。。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 100005;
struct Edge
{
int to,next;
}edge[maxn<<1];
int n,m,cnt,zero,one,head[maxn];
int color[maxn];
bool flag; //判断是否为二分图

void addedge(int u,int v)
{
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}

void dfs(int u)
{
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if(color[u] == color[v]) flag = false;
if(color[v] != -1) continue;
color[v] = color[u]^1;
if(color[v] == 0) zero++;
else one++;
dfs(v);
}
}

int main()
{
int t,u,v;
scanf("%d",&t);
while(t--)
{
cnt = 0;
memset(head,-1,sizeof(head));
memset(color,-1,sizeof(color));
flag = true;
scanf("%d%d",&n,&m);
if(n <= 1) {
printf("Poor wyh\n");
continue;
}
if(m == 0) {
printf("%d 1\n", n - 1);
continue;
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
int a = 0,b = 0;
for(int i = 1; i <= n; i++)
{
if(color[i] == -1 && head[i] != -1)
{
color[i] = 0;
zero = 1,one = 0;
dfs(i);
a += max(zero,one);
b += min(zero,one);
}
else if(color[i] == -1 && head[i] == -1)
a++;
}
if(flag == false)
{
printf("Poor wyh\n");
continue;
}
printf("%d %d\n",a,b);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论