
算法模板
巴黎没有欧莱雅你也不值得被拥有
发现自己近来好懒,好久没沉淀芝士了
展开
-
模板_poj1523SPF_割点以及点连通分支
poj1523题目链接题意: 图中是否有割点,去掉某个割点后有几个连通分量。block[i]是去掉割点i后的连通分支个数。割点:去掉这个点后,连通分支数比没去点这个点的连通分支数多1#include#include#includeusing namespace std;#define min(a,b) a<b?a:b #define max(a,b)原创 2017-04-28 10:12:38 · 626 阅读 · 0 评论 -
最小生成树(Prim算法)
/* 1 02 31 2 372 1 171 2 683 71 2 192 3 113 1 71 3 52 3 893 1 911 2 325 71 2 52 3 72 4 84 5 113 5 101 5 64 2 120Sample Output0171626*/ #include<stdio.h> #include<string.h>原创 2017-03-08 19:58:09 · 334 阅读 · 0 评论 -
最小生成树(Prim算法)加标记前驱的第二种方法
/*Input:6 10 1 2 6 1 3 1 1 4 5 2 3 5 2 5 3 3 4 5 3 5 6 3 6 4 4 6 2 5 6 6 Output:V1-V3=1 V3-V6=4 V6-V4=2 V3-V2=5 V2-V5=3 最小权值和=15 */#include<stdio.h>#include<string.h>#define INF 0x3f原创 2017-03-09 19:38:12 · 305 阅读 · 0 评论 -
最小生成树_krustra_通俗易懂()
/*6 92 4 113 5 134 6 35 6 42 3 64 5 71 2 13 4 91 3 219*/*/#includestruct edge{ int u; int v; int w;} e[10];int n,m;int f[7]={0},sum=0,count=0;void quicksort(int left,int原创 2017-04-14 09:11:33 · 958 阅读 · 1 评论 -
最小生成树_prim(加点)
prim算法是加点的,可以将加入的点和未加入的点分成两部分,及生成树和非生成树,每次从生成树顶点到非生成树顶点的最小权值,每次去更新到某个顶点的最小dis[]值。#includeint main(){ int n,m,i,j,k,min,t1,t2,t3; int e[7][7],dis[7],book[7]={0}; int inf=9999999; int count原创 2017-04-14 09:20:45 · 606 阅读 · 0 评论 -
poj1459Power Network_最大流的增广路算法_多源点多汇点问题(Edmord_Karp)
题目链接题目大意:现在有一个发电站,需要给用户送电。解释一下输入数据:总结点数 nodenum 电站数power 用户数consumer 电缆线数link然后link行,起点-终点 发电量然后power行,每个电站的产电量然后consumer行,每个用户的用电量解题思路:这道题是最大流的入门题,只是变成了多源多原创 2017-04-22 11:06:55 · 699 阅读 · 0 评论 -
模板_poj1273Drainage Ditches_最大流问题_残留网络流增广解决(Ford-Fulkerson方法)
题目链接 最大流定理 如果残留网络上找不到增广路径,则当前流为最大流;反之,如果当前流不为最大流,则一定有增广路径。这里涉及到了一个残留网络.如果已经理解了什么是最大流,算法说起来就比较好理解了,在每次找到一条增广路之后,就去更新它的流量(正反向都要更新),每次更新后再继续原创 2017-04-21 16:29:02 · 486 阅读 · 0 评论 -
poj3020_最小覆盖路径(顶点个数-二分图最大匹配数)
poj3020 题目链接建议做这题前先做下poj3041题目链接3041那题是最小点覆盖3020是最小路径覆盖题意: *--代表城市,o--代表空地 给城市安装无线网,一个无线网最多可以覆盖两座城市,问覆盖所有城市最少要用多少无线。公式:,最小路径覆盖=总节点数-最大匹配数;但是由于在建图的时候建的是无向图,所以最大匹配数=求得的最大匹配数/原创 2017-04-20 10:22:56 · 1831 阅读 · 0 评论 -
poj3041_匈牙利算法_二分图最小覆盖点(最大匹配数)
题目链接这里是不是应该写下什么是匈牙利算法(找到了一个非常容易理解的一个讲解趣味算法),这位大佬已经讲的很详细了~~~题意:在一个n*n的网格中,有k个炸弹吧,每次可以删除一行或者一列,要清除这所有炸弹最少要删除几次。思路(copy:参考链接):将每行、每列分别看作一个点,对于case的每一个行星坐标(x,y),将第x行和第y列连接起来,例如对于输入:(1,原创 2017-04-19 20:07:39 · 462 阅读 · 0 评论 -
二分图最大匹配
代码实现是通过(连锁反应)实现的,也叫增广路,每次发现一次增广路配对数就加1.增广路本质就是一条路径的起点和终点都是未被配对的点。如果)前匹配方案下再也找不到增广路,(继续对剩下没有被匹配的点一一进行配对,直到所有的点都尝试完毕,找不到新的增广路为止/*input: 6 51 41 52 52 63 4output: 3*/#includeint e[101][1原创 2017-04-15 17:03:00 · 494 阅读 · 0 评论 -
poj1236Network of Schools_强连通分量缩点(tarjan算法解决)
poj1236题目链接题目大意:有N个学校,从每个学校都能从一个单向网络到另外一个学校,两个问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。(就是最少加入几条边,让这个图变成强连通图)解题思路:首先找连通分量,然后看连通分量的入度为0点的总数,出原创 2017-04-24 14:43:35 · 408 阅读 · 0 评论 -
poj2186Popular Cows_ 强连通分支_缩点tarjan算法
题目链接 题意: 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。 先用tarjan求出每个强连通分量,再缩点,统计每个点的出度,如果有原创 2017-04-23 17:26:23 · 329 阅读 · 0 评论 -
模板_tarjan强连通缩点算法
#define min(a,b) a<b?a:bvectore[5005];stackS;int dfn[1005];int low[1005];int time,Bcnt;int Belong[1005];int in_stack[1005];int size_stack[1005];void tarjan(int u){ int i,v; S.push(u); in原创 2017-04-23 17:36:13 · 899 阅读 · 0 评论 -
模板_poj1201Intervals_差分约束系统解决(类区间问题)
poj1201题目链接题意:第一行输入n,下面输入n个限制条件,条件的格式为 ai bi ci, 0差分约数系统的含义,其实就是如果有n个变量在m个形如aj-ai>=bk(类似于求最长路径)条件下,求解的此不等式的方法。 而这种不等式的解法其实就是转化为图论的最小路的算法求解的。我们将上面的不等式边形后得到aj>=ai+bk正好就可以看做是从ai到aj权值是bk的一条原创 2017-04-24 21:01:15 · 748 阅读 · 0 评论 -
模板_数组实现邻接表
平时处理图边的问题我喜欢用vector实现,今天做了一道题发现用vector 会超时。。。。本来认为这两种方法一样的效率,甚至vector不仅方便还快,看来害死有区别的。贴一下模板(平时没有用过链接表处理的同学看下下面,我贴上了讲解。)memset(head,-1,sizeof(head));void add(int u,int v,double w){ edge[nu原创 2017-04-24 19:03:15 · 515 阅读 · 0 评论 -
最短路径(Dijkstra算法)也就是单源点问题!
/*Sample Input 5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100Sample Output 90 */#include<stdio.h>#include<string.h>#define N 1005#define INF 0x3f3f3fbool s[N];int d[N];int原创 2017-03-08 10:23:50 · 451 阅读 · 0 评论 -
最小生成树(Kruskal算法)模板
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define MAX 100int u[MAX];//边起始点int v[MAX];//边终点int w[MAX];//边权值int p[MAX];//并查集int r[MAX];//保存的边的序号int n,m;//n是结点数,m是原创 2017-03-08 09:21:13 · 738 阅读 · 0 评论 -
poj3255Roadblocks_次短路径
题目链接题意:某街区共有R条道路,N个路。道路可以双向通行。问1号路口到N号路口的次短路长度是多少?次短路指的比最短路路长度长的次短的路径。同一条边可能经过多次。思路是竟然是次短路,那么就是和最短相差了一条边(这条边是大于最短路径的最小值)多想下,所以一定是经过某一节点的(u,v)的边e(u,v);所以用到了源点到各个点的dis和终点到各个点的dis2;#include#原创 2017-05-03 09:07:24 · 611 阅读 · 0 评论 -
poj3352Road Construction_双连通分量(边)(tarjan算法之一)
poj3352题目链接题意:给出n个顶点,m条边,求至少添加几条边使这个图为双连通图。双连通图分为点连通和边连通图,其中他们之间还有着密切关系(具体可以根据自己需要深入了解)首先根据题意要求和求边连通的方法简单,我们选择用边连通的方法解决问题。将已经连通的图进行缩点,使之变成一棵树,那么最少添加的边个个数就是这棵树的(叶子节点数+1)/2;其实我们是根据每个节点的low原创 2017-04-27 11:16:49 · 587 阅读 · 0 评论 -
模板_matlab 匈牙利算法(最大匹配数/最小覆盖点)
bool dfs(int x){ for(int y = 1;y <= v2;y ++) { if(map[x][y] && !v2_vis[y]) { v2_vis[y]=1; if(v2_link[y]==0 || dfs(v2_link[y])) { v2_link[y]=x; return true; } } } return原创 2017-04-19 21:10:41 · 1716 阅读 · 0 评论 -
poj1328_Radar Installation(贪心区间解决)
(poj 1328 题)讲解:不再以雷达为中心找能最大覆盖岛屿的面积,而是一岛屿为中心,一最大距离d为半径找这个岛屿如果想要被覆盖,雷达所能在的位置区间。把n个区间按照左边的大小排序,我们比较右边的大小来找有多少个独立的区间,独立区间的个数就是需要雷达的个数。(记住公共区间需要缩小区间范围(当存在包含关系的时候要更新比较区间max的大小))这种题存在double 浮点型的题一定要仔细,原创 2017-04-12 20:29:00 · 346 阅读 · 0 评论 -
模板_Dijkstra最短路径算法
//初始化dis数组,这里是1号顶点到其余各个顶点的初始路程 for(i = 1;i <= n;i ++) dis[i]=e[1][i]; book[1]=1;//Dijkstra算法核心语句 for(i = 1;i <= n-1;i ++) { min = inf; for(j = 1;j <= n;j ++) { if(!book[原创 2017-04-19 20:51:46 · 272 阅读 · 0 评论 -
模板_拓扑排列
int TopSort(){ queueQ; size=0; for(i=0;i<n;i++) { if(indegree[i]==0) Q.push(i); } while(!Q.empty()) { int u=Q.front(); Q.pop(); size++; for(i=0;i<n;i++) { if(map[u][i])原创 2017-04-19 21:02:28 · 285 阅读 · 0 评论 -
模板_Bellman-frod算法(最短路径解决负权路问题)
//Bellman-ford算法核心语句dis[]都是记录源点到各个顶点的最小距离 for(k = 1;k <= n-1;k ++) for(i = 1;i <= m;i ++) if(dis[v[i]] > dis[u[i]] + w[i]) dis[v[i]] = dis[u[i]] + w[i]; //初始化dis数组,(1号顶点到原创 2017-04-19 20:31:28 · 522 阅读 · 0 评论 -
模板_一种排序
int cmp(Node a,Node b)//sort排序函数 {if(a.num!=b.num)return a.numy。意思是降序 else if(a.len!=b.len)return a.len<b.len;//按照题意是按照升序的顺序排列 else if(a.wide!=b.wide)return a.wide<b.wide;}原创 2017-04-20 10:51:26 · 235 阅读 · 0 评论 -
模板_krustra最小生成树算法
int cmp(node a,node b){ return a.w<b.w;} int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int join(int u,int v) { int x=find(u); int y=find(v); if(x!=y)原创 2017-04-20 11:01:17 · 470 阅读 · 0 评论 -
模板_prim最小生成树算法
//prim算法 for(i=1;i<=n;i++) dis[i]=e[1][i]; book[1]=1; count++; while(count<n) { min=inf; for(i=1;i<=n;i++) {原创 2017-04-20 11:04:18 · 371 阅读 · 0 评论 -
模板_素数打表
#includebool nosu[2000000];int main(){ int i,n,j; for(i=2;i<=1414;++i) if(!nosu[i]) for(j=i*i;j<=2000000;j+=i) nosu[j]=1; while(scanf("%d",&n)&&n) { for(i=原创 2017-04-20 11:11:59 · 1100 阅读 · 0 评论 -
模板_图的割点
什么时候用到图的割点呢?(当删除一个顶点后,图的连通量个数发生变化。)例如两国打仗,让你找到一个攻击点攻击后致使敌方的原连通的地方不再连同)如同所示:/*6 71 41 34 23 22 52 65 62 */#include#include#define min(a,b) a<b?a:busing namespace std;int n,m,root;i原创 2017-04-20 15:25:21 · 362 阅读 · 2 评论 -
模板_SPFA算法
SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。算法步骤:该算法需要使用到队列,这里我们用STL的queue比如求s点到所有点的最短路径。原创 2017-04-22 19:37:05 · 317 阅读 · 0 评论 -
模板_poj2299Ultra-QuickSort_归并排序qiu
题目链接题意: 给出你一个数字序列,让你输出用冒泡排序需要换多少次?两个数(a, b)的排列,若满足a > b,则称之为一个逆序对。有多少个逆序对就要换多少次,又因为冒泡排序是从后往前面交换的,归并是分成了若干个有序对从left,mid+1进行比较的。是从前往后的比较交换的。这里的一个规律就是交换的个数是:也就是记录A序列找到第一个比B某一个大的数,他后面还余下的数的个数就是原创 2017-05-02 20:02:01 · 379 阅读 · 0 评论 -
HDU1853Cyclic Tour_最小权最大匹配_KM负值解决
题目链接和最大权最大匹配一样,只是在存值的时候存的是负值,在判断if(-c>price[a][b])price[a][b]=-c;这一块还能保证重边的问题;也都是用的KM算法#include#include#define max(a,b) a>b?a:b#define INF 1<<31-1int price[105][105];int lx[105],ly[105];boo原创 2017-04-20 19:23:28 · 366 阅读 · 0 评论 -
模板_HDU2255奔小康赚大钱_最大权最大匹配问题_KM算法
题目链接:奔小康赚大钱KM算法类似于匈牙利算法,只是多了些东西(最大权值的交换,记录)KM算法详解链接不过这道题就已经是KM算法的入门题了相比之下多了两个数组x_price[],y_price[]x_price[]是记录其最大权忘了一个重点:在进入匹配的时候每次都要对x_vis[],y_vis[]清空(memset一下)在匈利牙算法中记得要把v2_vis[]清空一下。原创 2017-04-20 15:04:48 · 386 阅读 · 1 评论