• hdu 4751 2013南京赛区网络赛 二分图判断 **


    和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的

    hdu 2444

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cstring>
      5 #include<cmath>
      6 #include<queue>
      7 #include<map>
      8 using namespace std;
      9 typedef long long ll;
     10 #define cl(a) memset(a,0,sizeof(a))
     11 #define ts printf("*****
    ");
     12 #define MAXN 202
     13 vector<int>EV[MAXN];
     14 int linker[MAXN];
     15 bool used[MAXN];
     16 int uN;
     17 int matchs[MAXN],cnt[MAXN];
     18 bool dfs(int u)
     19 {
     20     int i;
     21     for(i=0;i<EV[u].size();i++)
     22     {
     23         int v=EV[u][i];
     24         if(!used[v])
     25         {
     26             used[v]=true;
     27             if(linker[v]==-1||dfs(linker[v]))
     28             {
     29                 linker[v]=u;
     30                 return true;
     31             }
     32         }
     33     }
     34     return false;
     35 }
     36 int hungary()
     37 {
     38     int res=0;
     39     int u;
     40     memset(linker,-1,sizeof(linker));
     41     for(u=1;u<=uN;u++)
     42     {
     43         memset(used,false,sizeof(used));
     44         if(dfs(u))  res++;
     45     }
     46     return res;
     47 }
     48 bool judge(int x,int y)     //交叉染色法判断二分图
     49 {
     50     int i;
     51     for(i=0;i<EV[x].size();i++)
     52     {
     53         if(cnt[EV[x][i]]==0)
     54         {
     55             cnt[EV[x][i]]=-1*y;
     56             matchs[EV[x][i]]=true;
     57             if(!judge(EV[x][i],-1*y)) return false;
     58         }
     59         else if(cnt[EV[x][i]]==y)  return false;
     60     }
     61     return true;
     62 }
     63 bool matched()
     64 {
     65     int i;
     66     memset(matchs,false,sizeof(matchs));
     67     for(i=1;i<=uN;i++)
     68     {
     69         if(EV[i].size()&&!matchs[i])
     70         {
     71             memset(cnt,0,sizeof(cnt));
     72             cnt[i]=-1;
     73             matchs[i]=true;
     74             if(!judge(i,-1)) return false;
     75         }
     76     }
     77     return true;
     78 }
     79 int g[MAXN][MAXN];
     80 int main()
     81 {
     82     int m,n;
     83     int i,j;
     84     int u,v;
     85     #ifndef ONLINE_JUDGE
     86     freopen("1.in","r",stdin);
     87     #endif
     88     while(scanf("%d",&uN)!=EOF)
     89     {
     90         n=uN;
     91         for(i=1;i<=uN;i++)
     92           if(EV[i].size())  EV[i].clear();
     93         cl(g);
     94         int id;
     95         for(i=1;i<=n;i++)
     96         {
     97             while(scanf("%d",&id)!=EOF&&id)
     98             {
     99                 g[i][id]=1;
    100             }
    101         }
    102         for(i=1;i<=n;i++)
    103         {
    104             for(j=i+1;j<=n;j++)
    105             {
    106                 if(!g[i][j]||!g[j][i])
    107                 {
    108                     EV[i].push_back(j);
    109                     EV[j].push_back(i);
    110                 }
    111             }
    112         }
    113          if(matched())
    114                   printf("YES
    ");
    115          else  printf("NO
    ");
    116     }
    117     return 0;
    118 }
  • 相关阅读:
    ORACLE 如何产生一个随机数
    Oracle数据库一些操作信息
    EXP-00091和IMP-00010报错
    ORACLE数据库 memory_target SGA 大小
    linux如何查看端口被哪个进程占用的方法
    命令信息
    Linux负载均衡软件LVS
    oracle 字段信息
    oracle数据库的启动与关闭
    idea解除版本控制
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4774372.html
Copyright © 2020-2023  润新知