演算法複習 2 sat(bzoj2199)

2022-05-23 13:48:10 字數 2240 閱讀 7831

由於對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')。他們的投票結果分別為vb_i (vb_i in ) and vc_i (vc_i in )。 最後,議案會以如下的方式決定:每只奶牛投出的兩票中至少有一票和最終結果相符合。 例如bessie給議案1投了贊成'y',給議案2投了反對'n',那麼在任何合法的議案通過 方案中,必須滿足議案1必須是'y'或者議案2必須是'n'(或者同時滿足)。 給出每只奶牛的投票,你的工作是確定哪些議案可以通過,哪些不能。如果不存在這樣乙個方案, 輸出"impossible"。如果至少有乙個解,輸出: y 如果在每個解中,這個議案都必須通過 n 如果在每個解中,這個議案都必須駁回 ? 如果有的解這個議案可以通過,有的解中這個議案會被駁回 考慮如下的投票集合: - - - - - 議案 - - - - - 1 2 3 奶牛 1 yes no 奶牛 2 no no 奶牛 3 yes yes 奶牛 4 yes yes 下面是兩個可能的解: * 議案 1 通過(滿足奶牛1,3,4) * 議案 2 駁回(滿足奶牛2) * 議案 3 可以通過也可以駁回(這就是有兩個解的原因) 事實上,上面的問題也只有兩個解。所以,輸出的答案如下: yn?

* 第1行:兩個空格隔開的整數:n和m * 第2到m+1行:第i+1行描述第i只奶牛的投票方案:b_i, vb_i, c_i, vc_i

* 第1行:乙個含有n個字元的串,第i個字元要麼是'y'(第i個議案必須通過),或者是'n' (第i個議案必須駁回),或者是'?'。 如果無解,輸出"impossible"。

3 41 y 2 n

1 n 2 n

1 y 3 y

1 y 2 y

yn?gold

2-sat問題的模板題目,先說2-sat問題的基本解法:

一些問題可以轉成布林方程來求解····

我們的目的是將其布林方程的每個文字拆開成兩點,一點表示其本身,一點表示它的非,比如a就拆成a與┐a,並且將各種運算符號轉化為只含有^(與)和->(a->b表示a為真則b為真)的形式,比如∨轉化為┐a -> b ^ ┐b -> a  ,a一定為真就轉換為  ┐a->a  的形式,然後將->轉換成邊,兩邊連上對應的點。

如果a與┐a在最後建成的圖的同乙個強連通分量裡···那麼布林方程有解

如果a所在強連通分量的拓撲序在┐a所在強連通分量的拓撲序之後,那麼a為真,之前a為假,如果相等則真假均可以取。這裡求拓撲序直接用tarjian即可,先找到的強連通分量的拓撲序一定更大

以上就是基本知識

但這道題有點特殊·····因為包含a拓撲序與┐a相等的情況要判斷····用tarjian的話有點麻煩···

但n很小···直接dfs即可····若a可以到達┐a,則說明a可能與┐a在同一強連通分量或者a所在強連通分量的拓撲序小於等於┐a的拓撲序

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=2005

;const

int m=10005

;int first[n],next[m],go[m],tot=1

,n,m;

bool

visit[n];

inline

void comb(int a,int

b)inline

int tran(int

a)inline

intr()

inline

void dfs(intu)}

inline

bool jud(int

u)int

main()

for(int i=1;i<=n;i++)

else

if(!flag1) cout<<"n"

;

else

if(!flag2) cout<<"y"

;

else cout<<"?"

; }

return0;

}

條件轉化,2 sat BZOJ 1997

time limit 10 sec memory limit 64 mb submit 1810 solved 684 submit status discuss 2 6 9 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 5 3 6 1 4 2 5 3 6 5 5 1 2 2 3 3 ...

演算法設計課程複習 2 優先佇列

優先佇列的出隊順序是按照優先順序來的,可以找到最小或者最大元素,同時支援插入或者刪除最小最大元素。優先佇列的格式 priority queue t 佇列中元素的資料型別 container 用於儲存和訪問佇列元素的底層容器的型別。compare 比較關係,預設是數值上的小於關係 return a優先...

WINDOWS程式設計 複習(2)

可選mm anisotropic 任意 x y 可選可選 上面這個圖我是從這個部落格轉過來的。至於有什麼區別了,我覺得說不清楚,直接給上測試 吧 include lresult callback wndproc hwnd,uint,wparam,lparam int winapi winmain h...