zoukankan      html  css  js  c++  java
  • 二分图判断——sgu 172. eXam

    自己的代码:
    用到了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;
    }
  • 相关阅读:
    如何让aboboo 便携版在citrix下使用(aboboo在IPAD上使用)aboboo苹果版
    旅游攻略:南京南京
    [软件分享]aboboo英语复读机 使用心得
    [计算机故障处理]EXCEL文件双击不能直接打开
    [办公应用]如何制作二Y轴图(excel)
    [办公应用]如何保护我的EXCEL表格结构,不被填表人员随意改动
    [计算机故障]为什么我的手机SD卡一打开就是说“你的磁盘未格式化,现在需要格式化吗”?
    [翻译角]Learn From George, Not Pinocchio(ESLPOD)
    [项目机会]小区内的交通流量监控及展示
    [计算机联网故障]WIFI接入正常,但是上网不正常(两种情况)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2025503.html
Copyright © 2011-2022 走看看