• 【2-SAT(两次DFS版)】BZOJ1823-[JSOI2010]满汉全席


    【题目大意】

    有n个材料,m个评委。每种材料可以被用来做满族菜或汉族菜,m个评委有两种可以让他满意的猜中。问是否可以满足所有评委要求?

    【思路】

    每天只能做三道题,我已经是一个废人了……(葛优躺.jpg)

    裸2-SAT,先写了个两遍DFS的,速度略慢……24ms?

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 const int MAXN=200+50;
     8 vector<int> E[MAXN];
     9 vector<int> rE[MAXN];
    10 vector<int> vs;
    11 int cmp[MAXN],vis[MAXN];
    12 int cnt,n,m;
    13 
    14 void addedge(int u,int v)
    15 {
    16     E[u].push_back(v);
    17     rE[v].push_back(u); 
    18 }
    19 
    20 void dfs(int u)
    21 {
    22     vis[u]=1;
    23     for (int i=0;i<E[u].size();i++)
    24     {
    25         int v=E[u][i];
    26         if (!vis[v]) dfs(v);
    27     }
    28     vs.push_back(u);
    29 }
    30 
    31 void rdfs(int u,int t)
    32 {
    33     vis[u]=1;
    34     cmp[u]=t;
    35     for (int i=0;i<rE[u].size();i++)
    36     {
    37         int v=rE[u][i];
    38         if (!vis[v]) rdfs(v,t);
    39     }
    40 }
    41 
    42 void init()
    43 {
    44     for (int i=0;i<MAXN;i++) vector<int>().swap(E[i]);
    45     for (int i=0;i<MAXN;i++) vector<int>().swap(rE[i]);
    46     scanf("%d%d",&n,&m);
    47     for (int i=0;i<m;i++)
    48     {
    49         char c1,c2;
    50         int x,y,fx,fy;
    51         getchar();
    52         scanf("%c%d %c%d",&c1,&x,&c2,&y);
    53         if (c1=='m') fx=x+n;else fx=x;
    54         if (c2=='m') fy=y+n;else fy=y;
    55         if (c1=='h') addedge(x+n,fy);else if (c1=='m') addedge(x,fy);
    56         if (c2=='h') addedge(y+n,fx);else if (c1=='m') addedge(y,fx);
    57     }
    58 }
    59 
    60 void solve()
    61 {
    62     memset(vis,0,sizeof(vis));
    63     for (int i=1;i<=n;i++) if (!vis[i]) dfs(i);
    64     memset(vis,0,sizeof(vis)),cnt=0;
    65     for (int i=vs.size()-1;i>=0;i--)
    66         if (!vis[vs[i]]) rdfs(vs[i],++cnt);
    67 }
    68 
    69 void get_ans()
    70 {
    71     for (int i=1;i<=n;i++)
    72         if (cmp[i]==cmp[i+n])
    73         {
    74             puts("BAD");
    75             return;
    76         }
    77     puts("GOOD");
    78 } 
    79 
    80 int main()
    81 {
    82     int T;
    83     scanf("%d",&T);
    84     while (T--)
    85     {
    86         init();
    87         solve();
    88         get_ans();
    89     }
    90     return 0;
    91 }
  • 相关阅读:
    CAN器件
    团队赋能
    电子模拟开关
    名言出处
    危机管理
    隔离技术
    让CSS布局更加直观:box-sizing
    浅谈跨域以WebService对跨域的支持
    给初学者的20个CSS实用建议
    JS中eval处理JSON数据 为什么要加括号
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5658842.html
Copyright © 2020-2023  润新知