-----------图论------------
Werky_blog
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
模板:Prim
思路: 先把1到 i 的边放进lowcost(反着找结果相同) 找lowcost中 1 到 i 的最小值,记录下标(id); 再把 id到 i 放进lowcost (lowcost[ id ]赋为-1,表示已经收录过了) mst 可以作为中间变量输出最小树; const int maxn=110; const int maxcost=99999999; int graph[maxn][原创 2017-09-23 13:53:26 · 197 阅读 · 0 评论 -
模板:最小割边数
做一遍最大流,满流设为1,其他为inf,再做一次最大流。 注意方向边流量不清零。 const int inf = 0x3f3f3f3f; const int maxn = 200 + 5; const int maxs = 3000 + 5; int n,m; struct Edge{ int from,to,cap,flow; }; struct Dicnic{ int原创 2017-10-16 14:42:32 · 238 阅读 · 0 评论 -
模板:最大流
Edmonds-Karp: 先BFS从起点开始的路径中找最小的容量,找到这么一条路径,到 t 截止。 update更新残存容量和运输流量,加到max_flow里, 再继续BFS找路径,update,直到没有路径能到 t 了,返回0; edmonds-karp返回最大流。 const int maxn=500; const int INF=2110000000; int visited原创 2017-10-08 17:30:15 · 187 阅读 · 0 评论 -
模板:最大流最小割
讲解:https://wenku.baidu.com/view/d9c9b9220722192e4536f6e1.html 给出矩阵时,转换为边存入edges: #define mem(a,x) memset(a,x,sizeof(a)) using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 50 +原创 2017-10-12 12:45:55 · 268 阅读 · 0 评论 -
模板:kruskal
思路:用结构体 e 存边,sort 排序,从小到大把边收入,并用并查集表示其端点是否收入。 //要注意e是边的长度 const int inf=999999999; int n,m,q,fa[1010]; struct edge{ int x,y,len; }e[20005]; bool cmp(edge a,edge b){ return a.len>b.len; }原创 2017-10-05 16:34:20 · 194 阅读 · 0 评论 -
模板:拓扑排序
拓扑排序:将“小于”关系看做有向图,形成一条排好序的关系,可能不唯一。 queue实现,vector存储: const int maxn=10005; int in[maxn],sum,n,m,fa[maxn]; vector G[maxn]; void toposort(){ queues; int flag=0; for(int i=0;i<n;i++){原创 2017-09-29 00:00:16 · 249 阅读 · 0 评论 -
模板:bellman-ford算法
思路: n-1次:找1 到剩下的n-1个点的最短路,因为是依次找的,所以是累加,dist【n】所以可以表示1 到n的最短路 注意:负权双向路径本来就是负权环 用于:1:找带负权的最短路 2:找负权环 若找正环,dist改为-inf,u+w,最好把flag优化去掉 const int maxn=105; const int maxm=maxn*maxn/2; const int inf=原创 2017-10-10 21:58:12 · 254 阅读 · 0 评论 -
模板:Floyed
Floyd可以判断有向环,并查集只能判断无向环。 for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(d[i][j]<inf&&d[k][j]<inf) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 如果只关心是否原创 2017-10-09 21:31:49 · 262 阅读 · 0 评论 -
构造表达式树
/* 加减往上排,乘除括号往下排 但仍然是按照自下向顶建树的 第二个if(c1<0): 没有加减先找括号,括号里的算完了再去找乘除,这里x+1把前括号吞了,便可以计算括号里面的,不会存在没有括号的。 */ #include #include #include using namespace std; const int maxn=1000; int lch[maxn],rch[maxn]; ch原创 2017-09-21 21:25:56 · 1153 阅读 · 0 评论 -
模板:费用流
刘汝佳紫书模板: const int maxn=10001; struct Edge//边 { int from,to,cap,flow,cost;//出点,入点,容量,当前流量,费用(也就是权值) Edge(int u,int v,int c,int f,int w):from(u),to(v),cap(c),flow(f),cost(w){} }; struct MCMF原创 2017-10-16 22:16:42 · 304 阅读 · 0 评论 -
模板:Dijkstra 队列优化
/* Dijkstra的算法思想: 在所有没有访问过的结点中选出dis(s,x)值最小的x 对从x出发的所有边(x,y),更新 dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y)) */ #include #include #include #include using namespace std; const int Ni = 10000; const int原创 2017-10-05 22:32:59 · 349 阅读 · 0 评论
分享