學習筆記(two sat)

2022-05-25 13:48:08 字數 4735 閱讀 2287

關於具體演算法

連邊方法

可行方案

tarjan縮點判無解之後,重新反向建圖,開個陣列,將a與a『所在聯通塊互相標記為敵人,tope dp的時候,依次將點取出,如果其沒有顏色,則將其標記為true,同時將其的敵人標記為false即可

#include#include#include#include#includeusing namespace std;

typedef int sign;

typedef long long ll;

#define for(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)

#define fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)

const int n=1000+5;

bool cmax(sign &a,sign b)

templatet read()

templatevoid write(t x,char y)

if(x<0)

static char wr[20];

int top=0;

for(;x;x/=10)wr[++top]=x%10+'0';

while(top)putchar(wr[top--]);

putchar(y);

}void file()

int n,m;

struct edge

e[n*n];

int head[n<<1],tt;

void add(int x,int y)

int lef[n],rig[n];

bool check(int i,int j)

void build(int x)

}int low[n],dfn[n],dfs_clock;

int scc[n],id;

int l[n];

void tarjan(int u)

else if(!scc[v])

}if(low[u]==dfn[u])

while(k^u); }}

void work()

*/ for(i,1,m) }

puts("panda is telling the truth...");

}int main()

#include#include#include#include#includeusing namespace std;

typedef int sign;

typedef long long ll;

#define for(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)

#define fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)

const int n=1e4+5,m=1e6+5;

bool cmax(sign &a,sign b)

templatet read()

templatevoid write(t x,char y)

if(x<0)

static char wr[20];

int top=0;

for(;x;x/=10)wr[++top]=x%10+'0';

while(top)putchar(wr[top--]);

putchar(y);

}void file()

struct edge

e[m<<2];

int head[n<<1],tt;

int n,m;

void add(int x,int y)

void input()

else if(opt[0]=='o')

else if(opt[0]=='x')

}}int dfn[n<<1],low[n<<1],l[n<<1],dfs_clock,scc[n<<1],id;

void tarjan(int u)

else if(!scc[v])

}if(low[u]==dfn[u])

while(k^u); }}

void work()

} puts("yes");

}int main()

poj3683

#include#include#include#include#include#includeusing namespace std;

typedef int sign;

typedef long long ll;

#define for(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)

#define fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)

const int n=5e3+5;

bool cmax(sign &a,sign b)

templatet read()

templatevoid write(t x,char y)

if(x<0)

if(x<10)putchar('0');

static char wr[20];

int top=0;

for(;x;x/=10)wr[++top]=x%10+'0';

while(top)putchar(wr[top--]);

putchar(y);

}void file()

struct edge

e[n*n];

int head[n<<1],tt;

int n;

void add(int x,int y)

int st[n][5],ed[n][5],las[n];

void deal(int i)

}bool early(int t1,int t2,int t3,int t4,bool flag)

}int dfn[n<<1],low[n<<1],l[n<<1],dfs_clock,scc[n<<1],id;

void tarjan(int u)

else if(!scc[v])

}if(low[u]==dfn[u])

while(k^u); }}

int beg[n<<1],nex[n<<1],to[n<<1],e,cf[n<<1],in[n<<1];

void add_new(int x,int y)

void rebuild()

} for(i,1,n) }

queueq;

int cl[n<<1];

void topesort() }}

void out()

else if(cl[scc[i+n]]==1)

}}void work()

} puts("yes");

rebuild();

topesort();

out();

}int main()

poj2723

#include#include#include#include#includeusing namespace std;

typedef int sign;

typedef long long ll;

#define for(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)

#define fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)

const int n=2e3+5;

bool cmax(sign &a,sign b)

templatet read()

templatevoid write(t x,char y)

if(x<0)

static char wr[20];

int top=0;

for(;x;x/=10)wr[++top]=x%10+'0';

while(top)putchar(wr[top--]);

putchar(y);

}void file()

struct edge

e[n*n];

int head[n<<1],tt;

int n,m;

int key[n];

void add(int x,int y)

int a[n],b[n];

void input()

for(i,1,m) }

int dfn[n<<1],low[n<<1],scc[n<<1],id,dfs_clock;

int l[n<<1];

void build(int mid) }}

void tarjan(int u)

else if(!scc[v])cmin(low[u],dfn[v]);

} if(low[u]==dfn[u])

while(k^u); }}

bool check(int mid)

return 1;

}void work()

write(ans,'\n');

}int main()

return 0;

}

TwoSAT演算法模板

該模板來自大白書 解釋 給多個語句,每個語句為 xi為真 假 或者 xj為真 假 每個變數和拆成兩個點 2 i為假,2 i 1為真 xi為真 或 xj為真 等價於 xi為假 xj為真 dfs演算法沒有回溯過程。函式說明 模板bfs函式在模板外一般用不到 void init int n 初始化 voi...

學習筆記 雜湊學習筆記

hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...

學習筆記 CentOS 學習筆記01

簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...