zoukankan      html  css  js  c++  java
  • HDU 5285 wyh2000 and pupil (二分图着色)

    题意:

      共有n个小学生,编号为1−n。将所有小学生分成2组,每组都至少有1个人。但是有些小学生之间并不认识,而且如果a不认识b,那么b也不认识a。Wyh2000希望每组中的小学生都互相认识。而且第一组的人要尽可能多。请你帮wyh2000求出第一组和第二组的人数是多少。如果找不到分组方案,则输出"Poor wyh"。


    思路:

      二分图着色。给的就是无向图,每次都累加人多的颜色即可。若不能着色,必定不能分成2组。如果全部都是1个颜色,那么要让其中1人过第2组。我勒个去,就因为赭色时颜色号码开小了而错。

      1 //#include <bits/stdc++.h>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <iostream>
      5 #include <map>
      6 #include <set>
      7 #include <deque>
      8 #include <algorithm>
      9 #include <vector>
     10 #define LL long long
     11 #define pii pair<int,int>
     12 #define INF 0x7f7f7f7f
     13 using namespace std;
     14 const int N=100000+100;
     15 
     16 vector<int> vect[N];
     17 int col[N];
     18 set<int> mapp;
     19 
     20 int color(int u, int f)
     21 {
     22     mapp.clear();
     23     deque<int> que;
     24     que.push_back(u);
     25     col[u]=f;
     26     mapp.insert(u);
     27     while(!que.empty())
     28     {
     29         int x=que.front();
     30         que.pop_front();
     31 
     32         for(int i=0; i<vect[x].size(); i++)
     33         {
     34             int tmp=vect[x][i];
     35             if(col[tmp]==col[x]) return 0;  //冲突
     36             if(col[tmp]==0)   //没色
     37             {
     38                 mapp.insert(tmp);//一个连同分量装进去
     39                 col[tmp]=1000000-col[x];
     40                 que.push_back(tmp);
     41             }
     42         }
     43     }
     44     return 1;
     45 }
     46 
     47 
     48 int cal(int n)
     49 {
     50     memset(col,0,sizeof(col));
     51     int big=0, small=0, k=0;
     52     for(int i=1; i<=n; i++)
     53     {
     54         if(!col[i])
     55         {
     56             if(!color(i, ++k)) return 0;
     57 
     58             //统计人数
     59             int a=0, b=0;
     60             set<int>::iterator it=mapp.begin();
     61             for(int j=0; j<mapp.size(); j++)
     62             {
     63                 if(col[*it]==k)   a++;
     64                 if(col[*it]==1000000-k) b++;
     65                 it++;
     66             }
     67 
     68             if(a<b) swap(a, b);
     69             big+=a;
     70             small+=b;
     71         }
     72     }
     73     if(!small)  return big-1;
     74     else return big;
     75 }
     76 
     77 
     78 
     79 int main()
     80 {
     81     freopen("input.txt", "r", stdin);
     82     int t, n, m, a, b;
     83     cin>>t;
     84     while(t--)
     85     {
     86         scanf("%d%d",&n,&m);
     87         for(int i=0; i<=n; i++)    vect[i].clear();
     88 
     89         for(int i=0; i<m; i++)
     90         {
     91             scanf("%d%d",&a,&b);
     92             vect[a].push_back(b);
     93             vect[b].push_back(a);
     94         }
     95         if(n<=1)
     96         {
     97              puts("Poor wyh");
     98              continue;
     99         }
    100         else if(n==2)
    101         {
    102              puts("1 1");
    103              continue;
    104         }
    105 
    106         int tmp=cal(n);
    107         if(tmp) printf("%d %d
    ",tmp, n-tmp);
    108         else  puts("Poor wyh");
    109 
    110 
    111     }
    112     return 0;
    113 }
    AC代码
  • 相关阅读:
    jquery easy ui 学习 (8)basic treegrid
    jquery easy ui 学习 (7) TreeGrid Actions
    jquery easy ui 学习 (6) basic validatebox
    jquery easy ui 学习 (5) windowlayout
    jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性
    提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
    visual studio 添加虚线的快捷键
    VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案
    visual studio 编译时 出现 Files 的值 乱码
    微信 连接被意外关闭
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4657727.html
Copyright © 2011-2022 走看看