關於具體演算法
連邊方法
可行方案
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...