zoukankan      html  css  js  c++  java
  • p4171&bzoj1823 满汉全席

    传送门(洛谷)

    传送门(bzoj)

    题目

    满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中。由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一。 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师。为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日之星。 大会的规则如下:每位參赛的选手可以得到n 种材料,选手可以自由选择用满式或是汉式料理将材料当成菜肴。大会的评审制度是:共有m 位评审员分别把关。每一位评审员对于满汉全席有各自独特的見解,但基本见解是,要有兩样菜色作为满汉全席的标志。如某评审认为,如果没有汉式东坡肉跟满式的涮羊肉锅,就不能算是满汉全席。但避免过于有主見的审核,大会规定一个评审员除非是在认为必备的两样菜色都没有做出來的狀况下,才能淘汰一位选手,否则不能淘汰一位參赛者。换句话說,只要參赛者能在这兩种材料的做法中,其中一个符合评审的喜好即可通过该评审的审查。如材料有猪肉,羊肉和牛肉时,有四位评审员的喜好如下表: 评审一 评审二 评审三 评审四 满式牛肉 满式猪肉 汉式牛肉 汉式牛肉 汉式猪肉 满式羊肉 汉式猪肉 满式羊肉 如參赛者甲做出满式猪肉,满式羊肉和满式牛肉料理,他将无法满足评审三的要求,无法通过评审。而參赛者乙做出汉式猪肉,满式羊肉和满式牛肉料理,就可以满足所有评审的要求。 但大会后來发现,在这样的制度下如果材料选择跟派出的评审员没有特别安排好的话,所有的參赛者最多只能通过部分评审员的审查而不是全部,所以可能会发生没有人通过考核的情形。如有四个评审员喜好如下表时,则不論參赛者采取什么样的做法,都不可能通过所有评审的考核: 评审一 评审二 评审三 评审四 满式羊肉 满式猪肉 汉式羊肉 汉式羊肉 汉式猪肉 满式羊肉 汉式猪肉 满式猪肉 所以大会希望有人能写一个程序來判断,所选出的m 位评审,会不会发生 没有人能通过考核的窘境,以便协会组织合适的评审团。

    Input

    第一行包含一个数字 K,代表测试文件包含了K 组资料。每一组测试资料的第一行包含兩个数字n 跟m(n≤100,m≤1000),代表有n 种材料,m 位评审员。为方便起見,材料舍弃中文名称而给予编号,编号分别从1 到n。接下來的m 行,每行都代表对应的评审员所拥有的兩个喜好,每个喜好由一个英文字母跟一个数字代表,如m1 代表这个评审喜欢第1 个材料透过满式料理做出來的菜,而h2 代表这个评审员喜欢第2 个材料透过汉式料理做出來的菜。每个测试文件不会有超过50 组测试资料

    Output

    每笔测试资料输出一行,如果不会发生没有人能通过考核的窘境,输出GOOD;否则输出BAD(大写字母)。

    Sample Input

    2
    3 4
    m3 h1
    m1 m2
    h1 h3
    h3 m2
    2 4
    h1 m2
    m2 m1
    h1 h2
    m1 h2

    Sample Output

    GOOD
    BAD

    分析

    将每一种材料拆成两个点—汉式和满式,每一个裁判的两种喜好之间是或的关系,搞2-sat即可。

    特别注意输入的材料可能是多位数,而且要注意每组的初始化

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int low[110000],dfn[110000],ist[110000],belong[110000],cnt,tot;
    vector<int>v[11000];
    stack<int>a;
    void tarjan(int x){
          dfn[x]=low[x]=++cnt;
          a.push(x);
          ist[x]=1;
          int i,j,k;
          for(i=0;i<v[x].size();i++)
             if(!dfn[v[x][i]]){
                 tarjan(v[x][i]);
                 low[x]=min(low[v[x][i]],low[x]);
             }else if(ist[v[x][i]]){
                 low[x]=min(low[x],dfn[v[x][i]]);
             }
          if(dfn[x]==low[x]){
              tot++;
              while(1){
                  int u=a.top();
                  a.pop();
                  ist[u]=0;
                  belong[u]=tot;
                  if(u==x)break;
              }
          }
    }
    int main()
    {     int n,m,i,j,k,t;
          cin>>t;
          while(t--){
              cnt=0;
              tot=0;
              memset(low,0,sizeof(low));
              memset(dfn,0,sizeof(dfn));
              memset(ist,0,sizeof(ist));
              memset(belong,0,sizeof(belong));
              while(!a.empty())a.pop();
              cin>>n>>m;
              for(i=1;i<=2*n;i++)v[i].clear();
              for(i=1;i<=m;i++){
                  string s,t;
                  cin>>s>>t;
                  int x=0,y=0,xx=0,yy=0;
                  int n1=s.length(),n2=t.length();
                  if(s[0]=='m')x=n;
                  for(j=1;j<n1;j++)
                     xx=xx*10+(s[j]-'0');
                  x+=xx;
                  if(t[0]=='m')y=n;
                  for(j=1;j<n2;j++)
                     yy=yy*10+(t[j]-'0');
                  y+=yy;
                  if(y>n){
                      v[x].push_back(y-n);
                  }else v[x].push_back(y+n);
                  if(x>n){
                      v[y].push_back(x-n);
                  }else v[y].push_back(x+n);
              }
              for(i=1;i<=2*n;i++)
                 if(!dfn[i])
                   tarjan(i);
              int ok=1;
              for(i=1;i<=n;i++)
                 if(belong[i]==belong[i+n]){
                 puts("BAD");
                 ok=0;
                 break;
               }
              if(ok)puts("GOOD");
          }
          return 0;
    }

  • 相关阅读:
    软件工程——理论、方法与实践 第三章
    软件工程——理论、方法与实践 第二章
    软件工程——理论、方法与实践 第一章
    使用@RunWith(SpringJUnit4ClassRunner.class)进行单元测试时 报错 和 java.lang.NoSuchMethodError的解决方法
    springMVC 校验时,CustomValidationMessages.properties中的错误提示信息的中文乱码 问题
    通过scrapy,从模拟登录开始爬取知乎的问答数据
    利用AJAX JAVA 通过Echarts实现豆瓣电影TOP250的数据可视化
    Scrapy爬取伯乐在线的所有文章
    搭建第一个scrapy项目的常见问题
    利用Ajax实现数据的同步传输,从mysql中提取数据,通过echarts可视化
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9049774.html
Copyright © 2011-2022 走看看