随笔分类 -  图论

最短路,网络流
摘要:tarjan 题意: 有n个数据维护中心,每个在h小时中需要1个小时维护,有m个雇主,他们的中心分别为c1,c2,要求这两个数据中心不能同时维护。 现在要挑出一个数据中心的子集,把他们的维护时间都推后一个小时。问最小推几个? 建图,如果对于一个顾客,两个数据维护中心维护时间正好差一个小时,那么前者向后者连一条边。在一个强连通分量里面的所有点必须选。。如果有连向其他的强连通分量,那么那个... 阅读全文
posted @ 2018-03-29 10:18 invoid 阅读(183) 评论(0) 推荐(0)
摘要:2-SAT。 tarjan缩点。强连通分量的点要选一起选。 #include #include #include using namespace std; const int maxn = 20000 + 10; const int maxm = 200000 + 10; int n,m; int a[maxn],b[maxn]; int g[maxn],v[maxm],next[ma... 阅读全文
posted @ 2016-07-07 20:55 invoid 阅读(153) 评论(0) 推荐(0)
摘要:bfs+最小树形图+kruskal算法。 最小树形图形象地来说就是有向图的最小生成树,这个不能拿kruskal算法或者是prim算法直接求,否则会错。 就是w[u][v]!=w[v][u]的情况。 而这道题用朱刘算法肯定是行不通的。 但是这道题的有向边并不是边的性质,而是点的高度决定的。这样我们就可以分层求最小生成树。 如果加进高度为h的点,只需用kruskal算法选最短的边就可以了,而... 阅读全文
posted @ 2016-07-02 20:30 invoid 阅读(340) 评论(0) 推荐(0)
摘要:spfa+dp。 首先用一个类似spfa的过程求出a[s][t],聪聪在s,可可在t时,聪聪第一步怎么走。 然后dp求出f[s][t],表示聪聪在s,可可在t的期望步数。 #include #include #include using namespace std; const int maxn = 1000 + 10; const int maxm = 2000 + 10; int... 阅读全文
posted @ 2016-07-01 13:52 invoid 阅读(176) 评论(0) 推荐(0)
摘要:堆+huffman树。 huffman二叉树构造法就是每次把最小的俩个合并起来,构成一个树。 但k叉树每回减少(k-1)个,可能最后会有一个坑位被浪费掉,导致答案增加(用心去感受) 于是我果断回忆去年他们游记里面写到,多余的先合并下。。 然后1A了。。。 #include #include #include #include #include using namespace ... 阅读全文
posted @ 2016-06-28 08:54 invoid 阅读(210) 评论(0) 推荐(0)
摘要:最短路+最小割 首先如何使最短路变长?就是要每一条最短路都割一条边。 我们求出每个点到点1和点n的距离,就可以知道哪些边在最短路上(一开始没有想到求到0和n的距离,想用floyd,但是n=500,怕超时。) 第二步呢,我们把每条在最短路上的边加入一个新图,跑最小割就可以了(把所有最短路都割掉一条边,最短路就变长了,这个也没想到) #include #include #include... 阅读全文
posted @ 2016-06-27 19:55 invoid 阅读(211) 评论(0) 推荐(0)
摘要:费用流。 传说中建模之集大成之题。。。 https://www.byvoid.com/blog/noi-2008-employee 题解 题解里面关于建模已经讲的很全了。 我根据自己的理解写写建模的实际意义。 如果a[i]-a[i-1]>=0,代表需要新雇佣人。否则就代表有人离开了。(离开并不一定要在t[i]+1天,如果后面人多余的话,很早就会离开)。 1.建模为S->i容量为 a[i... 阅读全文
posted @ 2016-06-25 13:50 invoid 阅读(162) 评论(0) 推荐(0)
摘要:费用流。 这道题的模型比较明显,拆点也是很容易看出来的。 #include #include #include using namespace std; const int maxn = 1000 + 10; const int maxm = 500000 + 10; const int inf = 0x3f3f3f3f; int g[maxn],v[maxm],f[maxm],c[ma... 阅读全文
posted @ 2016-06-23 15:44 invoid 阅读(156) 评论(0) 推荐(0)
摘要:莫名其妙的dfs算法。 1.这道题首先要推出来,如果有弓形或者环形,答案必须是环长度和弓形俩条路长度之差的约数。 而且如果你直接按照原图来建图你是跑不出来的。 1.如果你每个点访问一次时dfs所有点,tle。 2.如果你打vis标记,你判断不出来弓形,wa。 3.如果妄图用一个in数组记录哪个点in[u]=0,然后从这个点开始跑的话。整体做个环,甩出去个头支的。wa+奇奇怪怪的错误。 ... 阅读全文
posted @ 2016-06-23 08:29 invoid 阅读(248) 评论(0) 推荐(0)
摘要:二分+dfs。 这道题求图的最小环的每条边的权值的平均值μ。 这个平均值是大有用处的,求它我们就不用记录这条环到底有几条边构成。 如果我们把这个图的所有边的权值减去μ,就会出现负环。 所以二分求解。 阅读全文
posted @ 2016-06-20 20:49 invoid 阅读(173) 评论(0) 推荐(0)
摘要:tarjan,状态压缩。 首先直接暴力可过。 第一步tarjan缩强联通分量,图变成一个dag。跑一个拓扑排序。 然后倒序用一个f[i]二进制数组表示i能到达的点。 因为2000个点已知数据类型放不下,用一个bitset。 然后答案就是sum(size[u]*size[v]) f[u][v]=1,u能到v。 #include #include #include #include ... 阅读全文
posted @ 2016-06-17 12:11 invoid 阅读(175) 评论(0) 推荐(0)
摘要:二分图匹配。 每个点分为俩个点0和1,表示有床的人和要睡觉的人。跑最大流。 图中所有边的流量均为1 1.S向每个有床的人(0)连一条边。 2.每个不回家的人和校外的人(1)向T连一条边。 3.每个有床的人和自己连一条边(0->1)。 4.每个认识的人连一条边(0->1). 阅读全文
posted @ 2016-06-16 13:50 invoid 阅读(154) 评论(0) 推荐(0)