BZOJ2199 [Usaco2011 Jan]奶牛议会

首先激励一个2-SAT的裸模型,然后发现。。。tarjan没法判断‘?‘的情况

于是暴力对每一个议案check一下,直接dfs即可

  1 /**************************************************************
  2     Problem: 2199
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:160 ms
  7     Memory:884 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <algorithm>
 13
 14 using namespace std;
 15 const char ch[3] = {‘?‘, ‘N‘, ‘Y‘};
 16 const int N = 2005;
 17 const int M = N << 2;
 18
 19 struct edge {
 20   int next, to;
 21   edge() {}
 22   edge(int _n, int _t) : next(_n), to(_t) {}
 23 } e[M];
 24
 25 int n, m;
 26 int first[N], tot;
 27 bool vis[N];
 28 int ans[N];
 29
 30 int read() {
 31   int x = 0;
 32   char ch = getchar();
 33   while (ch < ‘0‘ || ‘9‘ < ch)
 34     ch = getchar();
 35   while (‘0‘ <= ch && ch <= ‘9‘)
 36     (x *= 10) += ch - ‘0‘, ch = getchar();
 37   return x;
 38 }
 39
 40 int get() {
 41   int x = read();
 42   char ch = getchar();
 43   while (ch != ‘Y‘ && ch != ‘N‘)
 44     ch = getchar();
 45   if (ch == ‘Y‘) --(x <<= 1);
 46   else x <<= 1;
 47   return x;
 48 }
 49
 50 void add_edge(int x, int y) {
 51   e[++tot] = edge(first[x], y);
 52   first[x] = tot;
 53 }
 54
 55 #define y e[x].to
 56 void dfs(int p) {
 57   int x;
 58   vis[p] = 1;
 59   for (x = first[p]; x; x = e[x].next)
 60     if (!vis[y]) dfs(y);
 61 }
 62 #undef y
 63
 64 bool check(int p) {
 65   int i;
 66   memset(vis, 0, sizeof(vis));
 67   dfs(p);
 68   for (i = 1; i <= n; ++i)
 69     if (vis[2 * i] && vis[2 * i - 1]) return 0;
 70   return 1;
 71 }
 72
 73
 74 int main() {
 75   int i, a, b, c, d, p, q;
 76   n = read(), m = read();
 77   for (i = 1; i <= m; ++i) {
 78     a = get(), c = get();
 79     if (a & 1) b = a + 1;
 80     else b = a - 1;
 81     if (c & 1) d = c + 1;
 82     else d = c - 1;
 83     add_edge(b, c);
 84     add_edge(d, a);
 85   }
 86   for (i = 1; i <= n; ++i) {
 87     p = check(2 * i - 1);
 88     q = check(2 * i);
 89     if (!p && !q) {
 90       puts("IMPOSSIBLE");
 91       return 0;
 92     }
 93     else if (p && q) ans[i] = 0;
 94     else if (!p) ans[i]= 1;
 95     else ans[i] = 2;
 96   }
 97   for (i = 1; i <= n; ++i)
 98     putchar(ch[ans[i]]);
 99   puts("");
100   return 0;
101 }

时间: 2024-08-24 18:06:23

BZOJ2199 [Usaco2011 Jan]奶牛议会的相关文章

【BZOJ2199】[Usaco2011 Jan]奶牛议会 2-SAT

[BZOJ2199][Usaco2011 Jan]奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出“是

【BZOJ2199】 [Usaco2011 Jan]奶牛议会

Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出“是”或“否”(输入文件中的'Y'和'N').他们的投票结果分别

BZOJ 2199: [Usaco2011 Jan]奶牛议会 [2-SAT 判断解]

http://www.lydsy.com/JudgeOnline/problem.php?id=2199 题意:裸的2-SAT,但是问每个变量在所有解中是只能为真还是只能为假还是既可以为真又可以为假 这样的话求$SCC$的做法就不好做了 于是只能用$naive$做法了,枚举每个变量选择真假然后$dfs$一遍看看是否可行 #include <iostream> #include <cstdio> #include <cstring> #include <algori

[Usaco2011 Jan]道路和航线

Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 <= R <= 50,000,编号为1到R) 和P条航线 (1 <= P <= 50,000,编号为1到P) 连接.每条道路i或者航线i连接城镇A_i (1 <= A_i <= T)到B_i (1 <= B_i <= T),花费为C_i.对于道路,0

BZOJ2200: [Usaco2011 Jan]道路和航线

n<=25000个点m1<=50000条正权无向边m2<=50000条正负权有向边,保证有向边连接的无向边联通块形成一个拓扑图,求从s到每个点最短路. 第一次发现不会最短路.没看题乱写迪杰无脑WA,很好.迪杰从来不能处理负权最短路,然后就开始啃题解..http://www.cnblogs.com/staginner/archive/2012/10/01/2709487.html这篇代码不错,讲得也很好. 在每个无向边联通块中找最短路可以直接迪杰.至于过度到不同的联通块,可以对无向图联通块

算法复习——2—sat(bzoj2199)

题目: Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以"每头牛 都可以获得自己想要的"为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出"是"或&quo

[USACO11JAN]大陆议会The Continental Cowngress_2-sat

题意: 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会. 议会以"每头牛 都可以获得自己想要的"为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出"是"或"否"(输

1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会

1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 471  Solved: 339[Submit][Status][Discuss] Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their finest gowns, complet

[bzoj1612][Usaco2008 Jan]Cow Contest奶牛的比赛_dfs

Cow Contest奶牛的比赛 bzoj-1612 Usaco-2008 Jan 题目大意:题目链接. 注释:略. 想法: 我们对于每个点dfs,看一下比这个点大的点加上比这个点小的点是否是n-1即可. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N