
ACM图论问题
HZ-VUW
这个作者很懒,什么都没留下…
展开
-
UESTC 92 LCA
题意一个游客到一个国家旅行,这个国家原来有n个城市,n-1条路,游客规划了q条旅行路线。现在这个国家要新修一条路,问新修这条路后q条旅行路线分别可以节约多少时间。题解LCA模板题。模板可以参考:http://blog.youkuaiyun.com/y990041769/article/details/40887469注意事项注意数组开大些,否则可能会出现RE或RF错误。代码#include <iostream>原创 2017-02-20 11:55:32 · 300 阅读 · 0 评论 -
UVA 11374 SPFA+路径打印
题意有廉价线路和普通线路,只有一次乘坐普通线路的机会,问从S到E花费最少的线路。并输出路径。题解由于只有一次机会,因此可以直接枚举乘坐的普通线路。针对每次选择,两遍SPFA(枚举正向和反向)。代码#include<bits/stdc++.h>#define LL long long#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l)原创 2017-11-22 19:59:01 · 317 阅读 · 0 评论 -
HDU 5952 搜索
题意给一个无向图,所有点的度小于等于20。问这个图中有多少个完全子图。题解完全图就是一个图任意两点之间都有边相连。由于所有点的度都很小,我们可以暴力枚举完全图。 枚举过程首先从1号点开始,然后枚举与1号点相邻的点,每次想队列中栈中插入一个点,直到栈的容量为S,如果这是后形成的图是完全图,那么就可以了,ans++。代码#include<bits/stdc++.h>#define LL long l原创 2017-09-18 20:47:29 · 376 阅读 · 0 评论 -
POJ2387 Dijkstra
题意输入两个数字,第一个数字为m,代表边的个数,第二个数字为n,代表点的个数,输入m条边,求最短路题解Dijkstra模板题。N次循环,每次循环挑选距离起始点最短且未访问的点,然后更新与此点有关的所有未访问的点到起始点的距离。N次循环后,便可得出起始点到任意一点的最短距离。注意事项此题要注意重边的情况,需要在边输入时,对重边进行过滤。还要注意,第一个数字为m,代表边的个数,第二个才是n,代表点的个数原创 2016-12-11 11:27:13 · 368 阅读 · 0 评论 -
POJ 1087 网络流
题意有N个电源适配器,M个电器,K种配对方案,一种电源适配器可以配对另一种电源适配器。求最多能适配多少个电器。题解网络流最重要的就是建图啦。这道题的话,建图的时候搭配map那是相当的方便。适配器和超级源点相连,电器和终点相连。超级源点到适配器的边容量为1,电器到超级终点的边容量为1。建好图后,扔到Dinic算法里就行了。注意事项一定要注意网络流的方向!!!!代码#include<cstdio>#i原创 2017-05-19 20:45:12 · 274 阅读 · 0 评论 -
POJ 3281 网络流
题意N只奶牛,F种食物,N种饮料。下面N行,首先两个数字,F,D。后面F个数字代表该牛喜欢的食物,D个数字代表该牛喜欢的饮料。每种食物和饮料只有一个,求最多能给多少头牛分配食物和饮料。题解这道题还是一道拆点的题,把牛喜欢的食物和饮料拆成两个点。所有食物连接到超级源点,所有饮料连接到超级终点。喜欢的食物连接到食物点,喜欢的饮料连接到饮料点。所有最大流为1。建好图后,直接套用Dinic算法即可。注意事项原创 2017-05-18 14:27:25 · 206 阅读 · 0 评论 -
POJ 3436 网络流+拆分
题意N台机器生产P个产品,流水线作业。每台机器可以同时执行W个相同任务,每个任务将P个产品的状态从P个状态变换为另外P个状态。求最多可以同时生产多少个产品?题解WA了好多次。。。不过讲道理这道题的核心在于点拆分,至于Dinic算法,直接把《训练指南》那本书上的Dinic代码搞上去就可以了。一旦涉及到这种流水线作业,肯定是要有一个超级源点和超级终点,这个在《挑战程序设计竞赛》上讲的很详细,这里就不解释原创 2017-05-18 13:19:59 · 976 阅读 · 0 评论 -
ECNU 3247 最小生成树+二分
题意中文题,不解释题解原本以为是一道普通的最小生成树问题,但是搞了很久都没办法控制最优选择顺序。后来看了题解才恍然大悟,怎么说呢,感觉很神奇。通过二分搜索去凑解,看似复杂度很高,但是计算一下就会发现复杂度只有O(n*log^2(n)),处于可以接受的范围。注意事项一定要注意kruskal算法里的变量要用double,在这里DEBUG了半天。代码#include <bits/stdc++.h>#de原创 2017-05-16 18:59:32 · 239 阅读 · 0 评论 -
UVA 1151 生成树
题意要让N个点连通,可以选择购买套餐,也可以选择自己手动连接两个点。购买套餐的话,套餐内的所有点会相互连接。手动连接的话,费用为两个点之间欧几里得距离的平方。求最低费用。题解暴力枚举购买套餐情况,针对每一种情况,使用Kruskal算法计算最小生成树的费用。在暴力枚举之前,可以先使用一次Kruskal算法降低时间复杂度,因为最后形成的最小生成树一定是由不购买任何套餐情况下最小生成树的边与套餐包含的边组原创 2017-03-16 17:07:22 · 261 阅读 · 0 评论 -
UVA 1395 生成树
题意求苗条度(最大边权值-最小边权值)最小的生成树题解暴力,针对每条边使用Kruskal算法即可。代码#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 10010#define INF 1e9using namespace std;int u[MAXN],v[MAXN],原创 2017-03-16 12:12:12 · 325 阅读 · 0 评论 -
UVA 658 状态压缩+最短路
题意有N个BUG,M个补丁,每个补丁有一定的使用时间。补丁使用前有一个字符串标识补丁使用的条件,0代表该位无条件,+代表该位必须有BUG才能使用该补丁,-代表该位必须没有BUG才能使用该补丁。补丁使用完也有一个字符串标识补丁使用的结果,0代表BUG状态没有改变,+代表新增加了BUG,-代表修复了BUG。初始条件为所有位均有BUG,求修复这些BUG所需要的最短时间。若不能修复所有BUG,则输出”Bug原创 2017-03-24 22:17:55 · 314 阅读 · 0 评论 -
UVA 10048 Flyod算法
题意给C个点,S条边,Q次查询。每次查询查询两个点之间边最大值最小的路径。求这个路径的边最大值。题解Flyod简单变形,d[i][j]=min(d[i][j],max(d[i][k],d[k][j]))即可注意事项输出好坑,非常容易PE。注意空行和空行输出位置!!!代码#include <iostream>#include<cstdio>#include<algorithm>#define I原创 2017-03-24 20:06:55 · 347 阅读 · 0 评论 -
UVA 247 Floyd算法
题意N个人,打了M次电话。假设M次电话为边,N个人为点,双向连通的点构成一个电话圈。求所有的电话圈。题解先用Flyod算法求出两个点之间是否连通,再用DFS求出电话圈。代码import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util原创 2017-03-24 11:37:20 · 284 阅读 · 0 评论 -
UVALive 4080 最短路树
题意给N个点,M条边,如果两个点之间没有边,则默认为l。问所有点两两之间最短路之和是多少。然后删除一条边,问删除某一条边后最大是多少。题解这道题第一问可以很简单用Floyd算法求解。但是第二问如果使用Floyd算法,就会存在超时的问题。贪心上也没有比较好的策略,因此考虑使用最短路算法暴力枚举。但是由于暴力枚举可能超时,因此引入最短路树的概念。最短路树就是一个点到其他所有点的最短路所形成...原创 2018-02-16 20:50:36 · 368 阅读 · 0 评论