vis

网络流Dinic算法

可紊 提交于 2020-01-16 13:29:44
我的模板 例题: https://vjudge.net/problem/HDU-4280 struct Edge { int lst; int from; int to; int cap; int flow; Edge () { } Edge (int llst, int ffrom, int tto, int ccap, int fflow) : lst(llst), from(from), to(tto), cap(ccap), flow(fflow) { } }; // Dinic 算法有3个重点: // 一个是 层次图 // 一个是 阻塞流 // 一个是 cur优化 // 稠密点的可以再加上 炸点优化 class Dinic { public: Edge edge[maxn*2]; int head[maxn]; int cn, cm, cst, ced; int csz; bool vis[maxn]; int dist[maxn]; // 节点到起点层次距离 int cur[maxn]; void init(int n, int m) { cn = n; cm = m; memset(head, 0, sizeof(head)); csz = 2; // 注意 这儿应该是偶数开始 因为 奇数^1等价于减1 偶数^1等价于加一. // 因为我前向星是以0为结尾的

二分图

≡放荡痞女 提交于 2020-01-16 03:06:59
二分图的判定: 染色: color[1]=1; bool dfs(int u) { for(ri i=head[u];i;i=bian[i].net) { int v=bian[i].to; if(color[v]&&color[v]!=color[u]) continue; if(color[v]&&color[v]==color[u]) return 0; if(!color[v]) { color[v]=3-color[u]; if(!dfs(v)) return 0; } } return 1; } View Code 二分图的最大匹配: bool dfs(int u) { for(int j=son[u];j;j=bian[j].net) { int v=bian[j].val; if(vis[v]) continue ; vis[v]=1; if(pipei[v]==-1||dfs(pipei[v])) { pipei[u]=a; return true; } } return false; } for(i=1;i<=n;i++) { if(pipei[i]==-1) { memset(vis,0,sizeof vis); ans=ans+dfs(i); } } View Code 相关定理: 转载: 罗茜 最小顶点覆盖:在二分图中寻找一个尽量小的点集

WHUT第六周训练整理

只愿长相守 提交于 2020-01-16 01:48:12
WHUT第六周训练整理 写在前面的话:我的能力也有限,错误是在所难免的!因此如发现错误还请指出一同学习! 索引 (难度由题目自身难度与本周做题情况进行分类,仅供新生参考!) 零、基础知识过关 一、easy:01、05、06、10、13、14、15、16、20 二、medium:02、04、07、08、09、11、12、18、19、21、22、23、24 三、hard:03、17 本题解报告大部分使用的是C++语言,在必要的地方使用C语言解释。 零、基础知识过关 本周是搜索场,用到的知识全都是两种基础的搜索方法( d f s 、 b f s dfs、bfs d f s 、 b f s )再加上一些细节、剪枝等。 d f s ​ dfs​ d f s ​ :深度优先搜索,对于一颗搜索树先往更深的地方进行搜索,如果找到了答案或者无法继续往更深的地方走则返回,适合于用于寻找是否存在可行解的情况。 b f s ​ bfs​ b f s ​ :广度优先搜索,对于一颗搜索树“一层一层”地搜索,如果找到答案则返回当前的层数,如果无法继续往下走则该答案不存在。 剪枝:在搜索的过程中存在很多不必要的步骤,如果我们明知道这样走没有作用,那么就不需要走了,即剪枝。常见的剪枝有:可行性剪枝、最优性剪枝、奇偶性剪枝等等。 还没有掌握的同学先自行在网上学习,基础的知识必须要熟悉! 总而言之 d f s dfs

pip install失败,提示Microsoft Visual C++ 14.0 is required,办法

余生长醉 提交于 2020-01-15 06:44:43
1、情况:系统 win10,64位,python3.7,想导入pymysql的API。 2、结果:pip安装失败。 之前的电脑是win7,64位,python27,当时直接cmd执行pip install pymysql,没遇到问题。这次换了电脑,遇到问题了,记录一下。 看了报错,试了很多办法,最后参考https://blog.csdn.net/chen_ke_hao/article/details/77075318,解决。以后安装其他的包遇到问题,也可以参考使用。 3、解决办法: 去https://www.lfd.uci.edu/~gohlke/pythonlibs/,找相应包的whl文件,下载到本地,随便存在一个目录,然后在那个目录打开cmd,安装这个whl。 1)可以全局搜索,在索引里面找: 下面这些就是对应的各种包,32位,64位,按需下载(注意python的版本,cp34,就是python3.4): 2)找到mysqlclient这个,我下载的是py37版本的64位包。 下好之后,放在任意一个目录里,我放在D盘根目录了,然后在D盘根目录处打开命令行: (如果需要切换到这个目录,就cd /d +目标路径,切换过去。) 执行pip install D:\mysqlclient-1.3.12-cp37-cp37m-win_amd64.whl 来源: https://www

一维跳棋(BFS)

落爺英雄遲暮 提交于 2020-01-14 00:41:12
一维跳棋是一种在1×(2N+1) 的棋盘上玩的游戏。一共有N个棋子,其中N 个是黑的,N 个是白的。游戏开始前,N 个白棋子被放在一头,N 个黑棋子被放在另一头,中间的格子空着。 在这个游戏里有两种移动方法是允许的:你可以把一个棋子移到与它相邻的空格;你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。 对于N=3 的情况,棋盘状态依次为: 1 WWW BBB 2 WW WBBB 3 WWBW BB 4 WWBWB B 5 WWB BWB 6 W BWBWB 7 WBWBWB 8 BW WBWB 9 BWBW WB 10 BWBWBW 11 BWBWB W 12 BWB BWW 13 B BWBWW 14 BB WBWW 15 BBBW WW 16 BBB WWW 对应的空格所在的位置(从左数)为:3 5 6 4 2 1 3 5 7 6 4 2 3 5 4。 输入格式 输入仅一个整数,表示针对N(1≤N≤10) 的取值。 输出格式 依次输出空格所在棋盘的位置,每个整数间用空格分隔,每行5 个数(每行结尾无空格,最后一行可以不满5 个数;如果有多组移动步数最小的解,输出第一个数最小的解) 样例输入 4 样例输出 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 用二进制来表示棋盘的状态 1 #include <stdio.h> 2

[THUPC2018] 绿绿和串串

江枫思渺然 提交于 2020-01-13 18:27:10
题目 水题,就当复习马拉车了; 设 \(vis_i\) 表示前缀 \(i\) 能否变换成功; 如果前缀 \(i\) 进行一次对称变换,长度为 \(i+i-1\) ;当 \(i+i-1>n\) 的时候,我们只需要判断回文半径是否不小于 \(n-i\) 即可; 当 \(i=i-1\leq n\) 时,如果进行变换后得到的是前缀 \(i+i-1\) ,那么 \(vis_i=vis_{i+i-1}\) ,否则 \(vis_i=0\) ; 于是我们只要判断 \(i\) 进行对称变换后是否为 \(i+i-1\) ,这相当于问 \(i\) 的回文半径是否为 \(i-1\) ,马拉车即可; 代码 #include<bits/stdc++.h> #define re register #define min(a,b) ((a)<(b)?(a):(b)) const int maxn=1e6+5;int n; int vis[maxn],r[maxn];char S[maxn]; int main() { int T;scanf("%d",&T); for(;T;--T) { scanf("%s",S+1);n=strlen(S+1);vis[n]=1; int R=1,mid=1;for(re int i=1;i<=n;i++)r[i]=0; for(re int i=1;i<=n;i++) {

网络流

与世无争的帅哥 提交于 2020-01-11 17:26:22
ISAP #include <iostream> #include <algorithm> #include <queue> namespace flow { const int N = 400000 + 7; const int INF = (1 << 30) - 1; struct flow { int n, m, st, ed; int lay[N], gap[N], cur[N], pre[N]; struct edge { int to, nex, cap; } e[N]; int fir[N], eid = 1; void addedge(int u, int v, int c); void addflow(int u, int v, int c); int isap(); }; void flow::addedge(int u, int v, int c) { e[++eid] = (edge){ v, fir[u], c }, fir[u] = eid; } void flow::addflow(int u, int v, int c) { addedge(u, v, c), addedge(v, u, 0); } int flow::isap() { std::queue <int> q; q.push(ed); for (int s; q.size(); ) {

拓扑排序

孤街醉人 提交于 2020-01-11 13:09:13
简单的回顾了一下拓扑排序,并做了几道题,在此做一下总结。 拓扑排序算法原理比较简单,但在实现上,给我提供了一种比较好用的技巧。 对这种需要判断环的存在的,需要区分历史遍历过的和现在正在遍历的。这里对 v i s [ ] vis[] v i s [ ] 进行了扩展,用 − 1 -1 − 1 来表示标记现在正在访问的路径,而访问结束标记为 1 1 1 。当然,这个只能在 d f s dfs d f s 中使用。 bool dfs ( int node ) { vis [ node ] = - 1 ; For ( i , 0 , G [ node ] . size ( ) - 1 ) { int u = G [ node ] [ i ] ; if ( vis [ u ] == - 1 ) return 0 ; if ( vis [ u ] == 1 ) continue ; -- deg [ u ] ; if ( ! deg [ u ] ) if ( dfs ( u ) == 0 ) return 0 ; } vis [ node ] = 1 ; return 1 ; } 当然,用堆或者队列之类的也是可以进行维护的。不过对于判断是否有环的话,还是 d f s dfs d f s 更适合。 下面来说一说具体的题目: H i h o c o d e r 1174 Hihocoder1174

【第三篇】数独终局

亡梦爱人 提交于 2020-01-11 12:46:22
个人项目:生成数独终局并求解 四.设计实现 2.编码实现 (2)求解数独模块设计实现 注:这周时间不太充裕,内容相对较简略,详细内容之后更新。 四.设计实现 2.编码实现 (2)求解数独模块设计实现 求解数独我首先尝试了DLX算法,但写到一半发现时间成本可能过高,因此转变成了基本的回溯算法,如果之后时间有充裕再考虑进一步优化成DLX算法。 回溯算法主要由SolveSoduku函数实现。 首先以ifstream的getline方法读入每行(ifstream正常读入的话遇空格、换行停止),对读入的每行数据进行处理,存入数组矩阵grid中。同时记录行数,当行数达到9,说明已经读入了一个完整的矩阵,进行回溯求解。 对每个完整矩阵的回溯求解以SolveSingleSoduku函数处理。标识矩阵中某一点是否被访问,一开始我用了非常繁复的方法,后来通过查阅资料 1 发现,可以通过设置一个vis数组进行实现: 使用vis[3][10][10]数组来标记:其中第一维中0表示行、1表示列、2表示九宫格;第二维中表示在第几个行、列或九宫格中;第三维表示其中的某个数字,如果该数字被填入了,vis值置1,否则置0。 因此,对于一个数独的具体求解就可以转化为:顺序搜索整个盘面数组grid,找到未填入数的格点(即数值=0),for循环1-9尝试放入数,继续向后填数,若最终整个棋盘都被填满,置is

vis.js

六眼飞鱼酱① 提交于 2020-01-10 20:27:26
1、官网: http://visjs.org/docs/network/ 2、示例: <!doctype html>   <html>     <head>     <title>vis.js</title>     <script type="text/javascript" src="vis.js"></script>     <link href="vis.css" rel="stylesheet" type="text/css" />     <style type="text/css">       #mynetwork {       width: 600px;       height: 400px;       border: 1px solid lightgray;       }     </style>     </head>     <body>       <div id="mynetwork"></div>       <script type="text/javascript">       // 创建节点数组       var nodes = new vis.DataSet([         {id: 1, label: 'Node 1'},         {id: 2, label: 'Node 2'},         {id: 3,