//暴力DFS,求字典序最小的解,也是求字典序唯一的方法 #include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=10000+10; struct TwoSAT { int n;//原始图的节点数(未翻倍) vector<int> G[maxn*2];//G[i]==j表示如果mark[i]=true,那么mark[j]也要=true bo…
#include <cstdio> #include <cstring> #include <stack> #include <queue> #include <vector> #include <algorithm> #define MAXN 40000+10 #define MAXM 200000+10 #define INF 1000000 using namespace std; struct Edge { int from,…
[题目大意] 和平委员会每个党派有2个人,只能派出其中1个,其中有一些人之间互相讨厌不能同时派出.求出派遣方案,如果有多种方案输出字典序最小的方案. [思路] 最小字典序只能用暴力染色.初始时均没有染色.枚举将党派第一个人染成红色,然后dfs把和它相连的全部染成红色,如果其中有的是蓝色那么矛盾:如果第一种情况矛盾那么dfs第二个人染成红色,如果也矛盾说明无解. #include<iostream> #include<cstdio> #include<cstring> #…
传送门 \(2-sat\)的模板题,首先得出题目中的二元关系为:对于有矛盾的\(x_i,x_j\),至多选择一个,那么连边\(x_i\rightarrow x_j',x_j\rightarrow x_i'\). 在这里这个关系是明确的关系,我们连边时只用连明确的关系即可.假设不选\(x_i\),我们也不知道\(x_j\)选不选,可选可不选,所以不用从\(x_i'\)出发连边. 然后题目因为要求字典序最小,据说\(trajan\)缩点那样搞可能出问题,因为数据范围比较小,所以直接\(O(nm)\)…
题目链接: https://vjudge.net/problem/POJ-1509 题目大意: 给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 解题思路: 最小表示法模板 注意模板返回的下标是从0开始,答案要求从1开始 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<string> #include<…
因为要求输出字典序最小的解,所以用暴力染色 具体有点像二分图染色 遍历0-2*n-1个点,尝试将每个点染成1,该点所能到达的所有点都要染成1 如果不行,则把上该点的影响消除,再把对立点染成1,如果还不行就无解 #include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 200005 vector<int>G[maxn]; int n,m,stk[maxn],top,mark[max…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个good和一个bad人结合起来,问这n个人是否能被分成两种人 其实就是判断是否为二分图,用染色法判断一下就可以了 #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm&…
用染色法判断二分图是这样进行的,随便选择一个点, 1.把它染成黑色,然后将它相邻的点染成白色,然后入队列 2.出队列,与这个点相邻的点染成相反的颜色 根据二分图的特性,相同集合内的点颜色是相同的,即 但是如果这个图不是二分图,那么就会这样 把与1相邻的点2,3染成白色,然后入队列,然后2出队列,要把与2相邻的点2,3染成黑色,但是都染过了,所以不用染色 但是3的颜色应该与2相反(如果是二分图的话),可是没有相反,所以就不是二分图 #include <stdio.h> #include <…
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector<node> map[10010]; int flow[10010][10010]; bool inq[10010]; int d[10010]; int pre[10010],pref[10010]; int minc,maxf; int main() { cin>>n>>…
通常我们在本地编译库(opecv.pcl)等我们喜欢使用make -jN  (N代表线程数)这样可以加速编译过程, 但是,这不一定是“线程安全”的,因为当某个线程在编译时,经常其他线程编译依赖本线程的结果,但是本线程编译 内容还没编译完全,导致报错.所以,使用多个线程编译时,我们通常使用“暴力编译法”,就是比如使用4个线程编译 make -j4  ,在编译进度30%时报错了,我们不清空之前的编译,而是继续make -j4 ,这时候就会发现前30%编译很快, 并且下次报错的地方和上次的不是同一个地…