图论
文章平均质量分 72
给糖吃的小骗子
懒人
展开
-
差分约束系统(最短路径问题)
转自:点击打开链接差分约束系统X1 - X2 X1 - X5 X2 - X5 X3 - X1 X4 - X1 X4 - X3 X5 - X3 X5 - X4 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。 这个不等式组要么无解,要么就有无转载 2017-04-26 17:08:38 · 2414 阅读 · 0 评论 -
POJ 2186Popular Cows(tarjan求连通分量+拓扑排序)
原题地址:点击打开链接题意:(A,B)表示A认为B是红人,如果有(A,B),(B,C)那么也有(A,C);求出被其他所有牛认为是红人的牛的个数。 思路:如果A和B都被其他所有牛认为是红人,那么显然A认为B是红人,B也认为A是红人,则说明A,B是属于一个强连通分量的。所以如果有一个牛被其他所有牛认为是红人,则该牛所属的强连通分量里的所有牛都被其他所有牛认为是红人。所以我们求出所有原创 2017-04-16 17:08:33 · 270 阅读 · 0 评论 -
POJ3041Asteroids(二分图最大匹配)
原题地址思路:将行和列转化为顶点,小行星的横坐标与纵坐标建边。即是求最小点覆盖,(最少的点数使得每条边都有点相连),二分图的最小点覆盖即是最大匹配。#include #include#includeusing namespace std;vectore[510];int pre[510];bool used[510];bool find(int u){ int i; f原创 2017-04-16 20:13:52 · 190 阅读 · 0 评论 -
POJ3026Borg Maze(BFS+prim最小生成树)
原题地址:点击打开链接#include#include#include#define MAX 1<<31-1using namespace std;struct Point{ int x; int y;};int d[110][110];char map[55][55];int numOfMap[55][55];int vis[55][55];int time[55原创 2017-04-17 10:25:16 · 830 阅读 · 0 评论 -
POJ3308_Paratroopers(最大流最小割)
原题地址:点击打开链接#include#include#include#includeusing namespace std;#define MAX 99999double min(double x,double y){ return x<y?x:y;}double map[110][110];int pos[110];int cheng[110];原创 2017-04-17 15:29:27 · 870 阅读 · 0 评论 -
POJ2195_Going home(最小费用流)
原题地址:点击打开链接建立源点s,汇点t,s与每个人之间建边,费用为0,容量为1,每个房子与t建边,费用为0容量为1,每个人与每个房子之间建边,费用为人到达房子的距离,容量为1,则该题转化为求最小费用流问题。#include#include#include#include#define MAX 1<<31-1#define min(x,y)(x<y?x:y)using na原创 2017-04-17 17:15:01 · 860 阅读 · 0 评论 -
HDU2389Rain on your Parade(最大匹配+Hopcroft-Karp算法)
原图地址:点击打开链接该题即使简单的二分图最大匹配问题,用匈牙利算法O(n*m)会超时,所以这里我们用Hopcroft-Karp算法,这个算法的时间复杂度为O(sqrt(n)*m).如果不了解这个算法可以看另一篇博客点击打开链接#include#include#include#include#include#define INF 1<<31-1using namespa原创 2017-04-18 16:24:36 · 936 阅读 · 0 评论 -
HDU 4185 Oil Skimming (最大匹配+匈牙利算法&Hopcroft-Karp算法)
原题地址:思路:该题主要的难度在于建图,统计出该图有多少个 ‘#’,并编号从1到n,建二分图,左边n个点,右边n个点,如果两点之间可以被一个矩形圈住就连边。则该题就转化为最大匹配问题。 我分别用了匈牙利算法和Hopcroft-Karp算法解该题。算法具体详解见:点击打开链接是在该题上时间效率上并没有什么差别,如果数据较大的情况下还是Hopcroft-Karp算法比较快,在另一题上有所原创 2017-04-18 21:21:48 · 1376 阅读 · 0 评论 -
LightOj 1251 Forming the Council(2-sat)
原题地址:点击打开链接#include#include#include#include#includeusing namespace std;int m;int time;int low[20000];int dfn[20000];int cmp[20000]; int in[20000];int color[20000];int fp[20000];bool原创 2017-04-19 14:30:59 · 404 阅读 · 0 评论 -
POJ2135 Farm Tour(最小费用流)
原题地址:点击打开链接该题可转化为流量为2的最小费用流#include#include#includeusing namespace std;#define MAX 1<<31-1struct Edge{ int to; int cost; int rev; int cap;};vectorg[1010];int dis[1010],n,prev[10原创 2017-04-16 09:53:13 · 823 阅读 · 0 评论 -
NYOJ188_Arbitrage(BellmanFord)
原题地址:点击打开链接这题与另一题类似:点击打开链接#include#include#includeusing namespace std;mapmp;double a[40][40];int n;void addEdge(char str1[],double x,char str2[]){ string s1=str1; string s2=str2; int u,原创 2017-04-14 15:14:05 · 1077 阅读 · 0 评论 -
NYOJ323_Drainage Ditches+最大流
原题地址:点击打开链接#include#include#include#includeusing namespace std;#define MAX 1<<31-1int min(int x,int y){ return x<y?x:y;}struct Edge{ int to; int cap; int rev;};vectorg[210];int used原创 2017-04-11 13:59:04 · 923 阅读 · 1 评论 -
NYOJ247虚拟的城市之旅_SPFA算法
原题地址:点击打开链接思路:用spfa算法求出从1点到每个点时所能买到的最小价格,在用spfa反过来求n到每个点所能买到的最大价格。然后求出最大的差价即是答案。 上一个自己乱画的图。。。#include#include#include#include#define MAX 100010#define max(a,原创 2017-04-11 20:00:01 · 805 阅读 · 0 评论 -
NYOJ有趣的问题(单源最短路径dijkstra)
思路:这题的难度主要是在建图上,建完图之后就是求单源最短路径问题。可用dijkstra算法.要注意他给出的墙的x坐标不是有序 的。#include#include#include#define MAX 999struct Position{ double x; double y;}p[100]; double map[100][100],pos[20][5],dis[100]原创 2017-04-12 10:46:47 · 985 阅读 · 0 评论 -
NYOJ326_Dining(最大流)
原题地址:点击打开链接思路:一开始当做二分图最大匹配问题来做,最后发现行不通。最后找到思路该题可用最大流解决。。建立超级源点0,和汇点end=f+2*n+d+1;建图:源点到食物f的流量为1,饮料到汇点的流量为1,重点是要将一只牛分成2个,每头牛与自己的流量为1,。即变为最大流问题。示例加草图:4 3 32 2 1 2 3 12 2 2 3 1 22 2 1 3 1原创 2017-04-12 16:56:05 · 845 阅读 · 0 评论 -
NYOJ434_Jungle Roads(最小生成树)
原题地址:点击打开链接用并查集实现prim算法,求最小生成树#include#includeusing namespace std;struct Edge{ int u; int v; int cost;}e[1000];int p[500];int comp(Edge e1,Edge e2){ return e1.cost<e2.cost;}int find原创 2017-04-12 20:52:57 · 882 阅读 · 0 评论 -
NYOJ349_Sorting It All Out
原题地址:点击打开链接该题用拓扑排序即可解决,建图之后先找入度为0的点,如果同时有2个或以上的顶点度数为0,则说明不可排序,如果拓扑排序结束后得到的答案小于顶点数则说明存在环,意思就是存在矛盾的关系式。#include#include#include#includeusing namespace std;vectornext[26];int p[26],pp[26],used[原创 2017-04-13 16:51:52 · 843 阅读 · 0 评论 -
NYOJ1072我想回家_最短路径
原题地址:点击打开链接此题略坑。。。#include#include#include#define MAX 1<<31-1struct Village{ double x; double y; double r;}village[110];int used[110],n;double dis[110],map[110][110],d;bool judge(int u原创 2017-04-13 21:49:29 · 873 阅读 · 0 评论 -
NYOJ489哭泣的天使(最大流)
原题地址:点击打开链接Foed-Fulkerson算法会超时,这里我们用Dinic算法#include#include#includeusing namespace std;int map[700][700],len[700],pos[700]; #define min(x,y)(x<y?x:y)bool bfs(int s,int t)原创 2017-04-14 13:28:04 · 956 阅读 · 0 评论 -
LightOJ - 1063Ant Hills 无向图割点
#include#include #include#define min(x,y)(x<y?x:y)using namespace std;vectore[10010];int time;int low[10010];int dfn[10010];int cut[10010];int n;int k=0;void find(int father,int u){ int原创 2017-04-19 19:55:02 · 848 阅读 · 0 评论 -
LightOJ - 1291 Real Life Traffic (tarjan算法求强连通分量)
该题意为问你最小让加几条边使得删除任何一条边所有的顶点任然连通。如果是不含环的图,使得所有的顶点度大于或等于2删除任何一条边其他的顶点任然连通,那么该题即转化为求连通分量的问题,求出连通分量之后缩点,然后统计出缩点后顶点的度,使得所有的顶点度大于等于2即可。原创 2017-04-19 21:04:53 · 873 阅读 · 0 评论 -
LightOJ - 1429-Assassin`s Creed (II)(tarjan找环缩点+bfs+最小路径覆盖)
原题地址:点击打开链接题意:有n个顶点组成的有向图,每个顶点都有一个目标,现在要派刺客去杀这些目标,刺客可以从任意点出发,且可以多次路过一个顶点,问至少要派多少刺客可以杀死所有的目标。思路:该题是一个最小路径覆盖的问题,(最小路径算法的介绍请看:点击打开链接),由于可能有环所以要用tarjian算法找出环并缩点,因为该题说可以重复经过一个顶点,所以我们要在求最小路径覆盖之前要先预处原创 2017-04-22 16:59:40 · 1215 阅读 · 0 评论 -
LightOJ - 1153-Internet Bandwidth(最大流)
原题地址:点击打开链接 该题是个简单的最大流模板题,唯一需要注意的是无向图,需要双向建边。#include#include#include#define INF 1<<31-1#define min(x,y)(x<y?x:y)using namespace std;struct Edge{ int to; int cap; int rev;};vectorg[110原创 2017-04-23 10:22:53 · 1037 阅读 · 0 评论 -
LightOJ - 1155-Power Transmission (最大流+拆点)
原题地址:点击打开链接由于该题顶点上有流量的限制,所以我们要先进行拆点,比如u点的流量限制为p的话,建边 u->u+n流量为p,在建立超级源点s,与汇点t,则该题转化为普通的最大流问题,该题用Ford-Fulkerson算法的话会超时,所以我们用Dinic算法进行求解。#include#include#include#include#define INF 1<<31-1#de原创 2017-04-23 11:28:07 · 837 阅读 · 0 评论 -
LightOJ - 1156-Jumping Frogs (二分+最大流+拆点)
原题地址:题意:一个青蛙要从河的左边跳到右边,河中有许多的石头排在一条直线上,有大的石头可以踩无数次,而小的石头只能踩一次。问你青蛙最少一次能跳多远才能从河的左边跳到右边,在从右边跳回左边。思路:可用最大流求解,该题的难点在与建图,把每个石头看成是一个顶点,由于顶点上也有流量限制,所以要进行拆点,如果是大石头就自身与自身建一条流量为2的点(因为只需要往返一次所以流量设为2即可),如原创 2017-04-23 15:12:10 · 1026 阅读 · 0 评论 -
LightOJ - 1176-Getting a T-shirt (最大流)
原题地址:点击打开链接题意:一共有6种码号的衣服,每个人可以接受2种中的任意一个,每个衣服有n种颜色(本题与颜色无关,其实告诉你有n种颜色就是告诉你每个尺码有n件衣服),一共有m个人,问这m个人能否都拿到适合自己的衣服。思路:可用最大流求解,人为左边的点,衣服为右边的点,每个人与适合自己的衣服之间建边流量为1,源点与人之间建边流量为1,衣服与汇点之间建边流量为衣服的个数n。如果求得原创 2017-04-23 16:10:58 · 872 阅读 · 0 评论 -
LightOJ - 1222-Gift Packing (最小费用流)
原题地址:点击打开链接#include#include#include#include #define INF 1<<31-1#define min(x,y)(x<y?x:y)using namespace std;struct Edge{ int to; int cap; int rev; int cost;};vectorg[110];int prev[110原创 2017-04-24 13:21:37 · 321 阅读 · 0 评论 -
LightOJ - 1177-Angry Programmer (最大流最小割+拆点)
原题地址:点击打开链接题意:一共有n台计算机,1号是发送端,n号是接受端你想让发送端与接受端之间无法通信,已经破坏每台电脑所需的费用(2--n-1),共有m条导线,每条线连接着两条电脑,并告诉你破坏这条线所需的费用,问你最少花费多少可以使得发送端与接受端之间无法通信。思路:最小割的问题,因为最小割等于最大流,我们只需要求最大流即可。把计算机看成是顶点,由于顶点上有费用的限制,所以我们进行拆原创 2017-04-24 08:47:56 · 992 阅读 · 0 评论 -
LightOJ - 1071-Baker Vai (最小费用流)
原题地址:点击打开链接题意:给你一个矩阵,每个点上都有一个数字代表需要被救的人数,你从(1,1)点出发开始救人走过的点不能再走,不过你只能向右或者向下走,到达终点后(m,n)返回起点,只能向上或者左走,每路过一个点就可以救该点有的人数,问你最多可以就多少人。思路:可转化为最小费用流问题,关键的难点在于建图,该题需要拆点,每个点到自身的流量为1,(起点和终点的流量为2),然后根据顶点之间的可原创 2017-04-24 11:09:32 · 323 阅读 · 0 评论 -
LightOJ - 1152-Hiding Gold (最大匹配)
原题地址:点击打开链接解题思路:最小边覆盖+最大匹配=顶点总数,求出最大匹配即可#include#include#include#includeusing namespace std;struct Point{ int x; int y;}p[410];vectorg[410];int V;int used[410];int match[410];bool ju原创 2017-04-22 14:37:51 · 797 阅读 · 0 评论 -
LightOJ - 1150-Ghosts! (bfs+最大匹配+二分)
原题地址:点击打开链接#include#include#include#includeusing namespace std;struct Edge{ int to; int cost;};struct Point{ int x; int y; int step;};char str[26][26];int gid[26][26];int hid[26][2原创 2017-04-22 13:34:12 · 843 阅读 · 0 评论 -
LightOJ - 1074-Extended Traffic (spfa判负环)
原题地址:题意,1为源点,(u,v)的距离为(m[v] -m[ u])3的,如果从源点到该点的距离小于3则输出?,否则输出距离。如果存在负环,那负环上的点到源点的距离肯定小于3.#include#include#include#include#define INF 1<<31-1using namespace std;int b[210],n;int dis[210];原创 2017-04-20 12:30:48 · 922 阅读 · 0 评论 -
lightOJ-1108-Instant View of Big Bang (spfa找负环)
原题地址:点击打开链接题意:让你找出分别从1到n出发,能否到达过去,意思就是能否到达负环。那么负环上的点肯定是都可以的,还有能到达负环的点是可以的,反向建图即可。找到一个负环上的点后,遍历它所能达到的点。#include#include#include#include#define INF 1<<31-1using namespace std;struct Edge{原创 2017-04-20 15:21:23 · 379 阅读 · 0 评论 -
lightoj-1221-Travel Company(spfa找负环)
思路:题意问你能否找出一条能回到出发点的路径,并且该路径上总收入和 / 总花费和 >=p,将该题转化一下,每条边的权值设为 (收入-花费*p),那么如果存在一条路径使得回到出发点时,总的收入增多。则该路径满足要求。原创 2017-04-20 16:40:22 · 877 阅读 · 0 评论 -
LightOJ - 1002 -Country Roads
原题地址:点击打开链接思路:该题与克鲁斯卡尔算法求最小生成树的方法类似,将边按权值从小到大排序,依次加入集合,如果加入后源点与某个点连通了,那么该条边的权值就是源点与该点所有路径中的最大值的最小值。#include#include#includeusing namespace std;struct Edge{ int u; int v; int cost;}edge[16原创 2017-04-20 18:46:34 · 890 阅读 · 0 评论 -
lightoj-1029-Civil and Evil Engineer(最小生成树+克鲁斯卡尔算法)
原题地址:点击打开链接#include#include#includeusing namespace std;struct Edge{ int u; int v; int cost;}edge[12010];int p[110];int k=0,n;int comp1(Edge e1,Edge e2){ return e1.cost<e2.cost;}int c原创 2017-04-20 19:28:41 · 776 阅读 · 0 评论 -
LightOJ - 1123-Trail Maintenance (最小生成树+克鲁斯卡尔算法)
原题地址:注意要删除不需要的边,否则会超时。#include#include#includeusing namespace std;struct Edge{ int u; int v; int cost;}edge[6010],e[6010];int p[210];int k=0,n;int cnt;int comp(Edge e1,Edge e2){ ret原创 2017-04-20 20:45:41 · 1178 阅读 · 0 评论 -
LightOJ - 1380-Teleport (最小树形图)
原题地址:点击打开链接最小树形图的模板题。#include#include#include#include#include#define INF 1<<31-1using namespace std;struct Edge{ int u; int v; int w;}edge[10010];int in[1010];int id[1010];int vis[1原创 2017-04-21 19:26:23 · 875 阅读 · 0 评论 -
LightOJ - 1149- Factors and Multiples (最大匹配问题)
题意,给你两个集合A,和B,问你最少删除集合A和B中的几个数才能使得集合B中不存在可以整除集合A中的数,将该题转换为二分图的最大匹配问题即可,集合A为左边的点,集合B为右边的点,如果B集合中的某个数可以整除A集合中的某个数则连一条边,如何才能使得A,B之间不存在这种整除关系呢,我们找出最小顶点覆盖即可,(最小顶点覆盖就是最小的顶点数集合V,能使该图中每一条边都至少有一个顶点属于V)如果将最小顶点覆盖数删除,则图中所有的边都将不存在,意思就是不在存在这种整除关系。 在二分图中,最大匹配数原创 2017-04-22 09:04:19 · 824 阅读 · 0 评论 -
NYOJ677谍战(最大流最小割问题)
原题地址:点击打开链接思路:该题让求最少需要封的道路条数,即最小割。建立超级源点0,并与敌人所在的城市建边,容量设为最大值MAX,其他点之间的容量都设为1,则该题即转化为求最大流问题。#include#include#define MAX 29999int map[210][210],used[210],pre[210],n,m;bool dfs(int u){ int v;原创 2017-04-11 09:08:07 · 1012 阅读 · 0 评论