zoukankan      html  css  js  c++  java
  • poj 1466

    Girls and Boys

    题意:有人想对学校里面的男女学生做暧昧关系做研究,要将没有暧昧关系的学生分到同一个组里面,问一个组最大人数是多少。

    分析:每两个节点之间都不相邻,也就是求二分图最大点独立数。在没有孤立点的二分图里,最大点独立数=n-最大匹配数。

    View Code
     1 #include<cstdio>
     2 #include<vector>
     3 using namespace std;
     4 vector<int> vex[500],group;
     5 int n,m,max_match,sum,mat[500],set[500],counter;
     6 bool visited[500],over[500];
     7 int path(int u)
     8 {
     9     int i,v;
    10     for(i=0;i<vex[u].size();i++)
    11     {
    12         v=vex[u][i];
    13         if(!visited[v])
    14         {
    15             visited[v]=true;
    16             if(mat[v]==-1 || path(mat[v]))
    17             {
    18                 mat[v]=u;
    19                 mat[u]=v;
    20                 return 1;
    21             }
    22         }
    23     }
    24     return 0;
    25 }
    26 int Hungary()
    27 {
    28     int ans=0,i,j;
    29     for(i=0;i<n;i++)
    30         mat[i]=-1;
    31     for(i=0;i<group.size();i++)
    32     {
    33         for(j=0;j<n;j++)
    34             visited[j]=false;
    35         ans+=path(group[i]);
    36     }
    37     return ans;
    38 }
    39 void dfs(int u,int color)
    40 {
    41     int i,v;
    42     over[u]=true;
    43     counter++;
    44     if(color==0)
    45         group.push_back(u);
    46     for(i=0;i<vex[u].size();i++)
    47     {
    48         v=vex[u][i];
    49         if(!over[v])
    50             dfs(v,(color+1)%2);
    51     }
    52 }
    53 int main()
    54 {
    55     int i,j,e;
    56     while(~scanf("%d",&n))
    57     {
    58         for(i=0;i<n;i++)
    59         {
    60             scanf("%d: (%d)",&i,&m);
    61             for(j=0;j<m;j++)
    62             {
    63                 scanf("%d",&e);
    64                 vex[i].push_back(e);
    65                 vex[e].push_back(i);
    66             }
    67             over[i]=false;
    68         }
    69         sum=0;
    70         for(i=0;i<n;i++)
    71         {
    72             if(!over[i])
    73             {
    74                 counter=0;
    75                 dfs(i,0);
    76                 max_match=Hungary();
    77                 sum+=counter-max_match;
    78                 group.clear();
    79             }
    80         }
    81         printf("%d\n",sum);
    82         for(i=0;i<n;i++)
    83             vex[i].clear();
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/ZShogg/p/2946871.html
Copyright © 2011-2022 走看看