條件轉化,2 sat BZOJ 1997

2022-05-01 19:36:10 字數 2118 閱讀 1698

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 4

4 5

5 1

1 2 3 4 5

noyes

思路:(from 出題人):

如果只考慮簡單的平面圖判定,這個問題是非常不好做的。但是題目中有乙個條件——這張圖存在一條哈密頓迴路。

我們把哈密頓迴路在平面上畫成乙個圓。仔細觀察一下。每條邊如果畫在圓內都是一條弦,那如果弦在圓內相交怎麼辦?把另一條弦翻出去。能不能兩條弦都翻出去呢?不能,因為如果兩條邊在圓內相交,那麼它們在圓外也會相交。那我們是不是就相當於就多了乙個條件:這兩條邊不能同時在乙個域內。

所以,這張圖中總共只有兩個域,圓內和圓外。那麼我們是不是就轉化了模型:有若干個點和若干條邊,你要給每個點黑白染色,使得每條邊的兩個端點顏色不同。直接dfs就可以了。還有個問題,邊數是10^4,暴力連邊會超時,但是平面圖有乙個定理:m<=3*n+6,那這個定理來剪枝就行了。

然後我們只要對輸入的哈密頓環進行標號,然後這樣就是乙個圈,假定剛開始都是在圈內,然後我們只需要判斷是否在圈內就行了。

好像我的**因為用了map和edges這些東西,所以跑的速度比別人慢乙個log= =,別人都是200ms左右,我是2000ms,人生第一次體驗到了map所帶來的絕望

#include using

namespace

std;

#pragma comment(linker,"/stack:102400000,102400000")

#define ll long long

#define all(a) a.begin(), a.end()

#define pb push_back

#define mk make_pair

#define fi first

#define se second

#define haha printf("haha\n")

const

int maxn = 1e5 + 5

;struct

twosat

void add_edge(int x, int xval, int y, int

yval)

void

display()

cout

<}}

bool dfs(int

x)

return

true

; }

bool

solve()}}

return

true

; } };

twosat tar;

intn, m;

mapid;

mapint, int>, int>point;

vector

int, int> >edges;

bool test(int u1, int v1, int u2, int

v2)

intmain()

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

if (m >= n * 3 + 6

) tar.init(m);

for (int i = 0; i < m; i++)}}

if (tar.solve()) puts("

yes"

);

else puts("no"

); }

return0;

}

view code

R語言 資料轉化2

資料框的轉置 行與列的轉置t 函式,單獨轉置一行利用rev函式即可用於向量也可用於資料框 修改資料框中的值 eg 將women資料集中身高英吋換位厘公尺 為單位 如果需要修改的值較多上面的方法就不高效率,可以利用transfor函式可以任意修改資料框中列的值 如果不想修改原資料那麼可以再定義乙個值 ...

進製轉化(10 gt 2)

用雙向動態鍊錶儲存資料,沒有資料大小限制 可以轉換負數 include stdio.h include malloc.h intmain void struct num2 p,q,head,end intnum unsigned x scanf d num x unsigned num 將有符號變數...

2 條件語句

python條件語句是通過一條或多條語句的執行結果 true或者false 來決定執行的 塊。python程式語言指定任何非0和非空 null 值為true,0 或者 null為false。python 程式設計中 if 語句用於控制程式的執行,基本形式為 if 判斷條件 執行語句 else 執行語...