有n個人分為好人和壞人,說了m句話。好人不會說假話,壞人至多說一句謊話。求出一組解,滿足要求。
利用2-sat拆點,乙個人拆成兩個點,表示他是好人和壞人。然而這樣的話邊數是m^2的,所以用前/字尾和優化構圖即可。
1 #include 2view codeusing
namespace
std;34
const
int n = 1e6 + 10;5
const
int m = 3e6 + 10
;6 inline int
read()710
while(ch >= '
0' && ch <= '
9')
11return x *f;12}
13int
n, m;
14int
h[n], e[m], ne[m], idx;
15int dfn[n], low[n], num, in
[n], stac[n], top, pre[n];
16int
c[n], cnt;
1718
void add(int a, int
b)19
2425
int crm(int x, int
f)26
2930
int word(int x, int
f)31
3435
void tarjan(int
u)36
48else
if(in
[j])
49 low[u] =min(low[u], dfn[j]);50}
51if(low[u] ==dfn[u])
52while(z !=u);60}
61}6263
64int
main()
6586
for (int i = 1; i <= n; i ++)
8791
for (int i = 1; i <= (n + m) * 2; i ++)
92if(!dfn[i])
93tarjan(i);
94bool flag = true;95
for (int i = 1; i <= n; i ++)
96102
}103
for (int i = 1; i <= m; i ++)
104110
}111
if(!flag)
112115
else
116123 cout << ans.size() << '\n'
;124
for (int i = 0; i < ans.size(); i ++)
125128
}129 }
210 UER 6 尋找罪犯
開始就感覺是 二分圖 然後就棄t1後就一直想一直想 然而也沒想出來 暴力都沒法打啊.題解確實是二分圖 演算法四的優化也是非常神 神的到現在也沒看懂.60 include include include include includeusing namespace std const int n 80...
UOJ210 尋找罪犯 字首邊優化2 SAT
學了一天2 sat 從不會到尋找罪犯,感覺成就感滿滿 順便還嘴巴ac了 noi2017遊戲 雖然這就是一道水題,真的是水題 uoj210傳送門 題面me就不貼了 要看的話可以戳傳送門 emmmm網上的做法為什麼都那麼簡單啊woc?感覺全世界就me建邊最多 這道題的限制條件還是很清晰了 1.一句話,不...
uoj 209 UER 6A 票數統計
給出n個數,每個數是0或1.再給出m個限制,每個限制 x,y 表示 前x個數中有y個1 或 後y個數中有x個1 求這樣的序列的個數。n 5000,m 1000 再一次被uer給虐了。其實這道題劼鏼爺已經講的很清楚了。撲通撲通跪下來 當x y的時候,很顯然已經確定這個限制是限制字首還是字尾的。當x y...