图论
magnte
这个作者很懒,什么都没留下…
展开
-
牛站(恰好经过k条边的最短路)
牛站类似于矩阵快速幂,在floyd中,d[i][j] = min(d[i][j],d[i][k] + d[k][j])表示将d[i][j]更新成可经过k个点的最短路,在这题中,d[i][j]表示经过k条边的最短路。所以对于给定的k,利用快速幂将k将为logk,对每一位1更新res。(记得离散化)。具体看注释。#include<bits/stdc++.h>using namespace std;const int N = 210;int k,m,s,e,n;int g[N][N原创 2021-11-12 21:33:58 · 524 阅读 · 0 评论 -
观光之旅(无向图的最小环问题)
观光之旅见注释:#include<bits/stdc++.h>using namespace std;const int N = 110;int n,m,cnt;int g[N][N],d[N][N];int pos[N][N];int path[N];void get_path(int i,int j)//递归找经过的点{ if(pos[i][j] == 0) return ; int k = pos[i][j]; get_原创 2021-11-12 17:57:27 · 770 阅读 · 0 评论 -
排序(传递闭包 floyd)
排序按照a < b则在a和b中连一条长度为1的边建图,d[a][b] = 1表示a小于b,每加入一组数据跑一边floyd,(实际上就是动态规划更新一下每个点能到的点),判断三种情况:存在d[i][i] = 1,i 大于 i 说明存在矛盾。存在d[i][j] = 0 && d[j][i] = 0说明无法判断 i 和 j 的大小,无法确定关系。否则可以确定,输出大小可以类似于拓扑排序的思想输出。#include<bits/stdc++.h>using names原创 2021-11-12 17:41:33 · 744 阅读 · 0 评论 -
dijkstra的应用
昂贵的聘礼建立一个虚拟点,从虚拟点到每个点连一条边表示直接买某件物品的价格,所以从虚拟点走到1的最短路就是得到结果的最小价值。对于题目的地位限制,可以对每个满足地位的区间分别做一次dijkstra取最小值即可#include<bits/stdc++.h>using namespace std;const int N = 110;const int inf = 0x3f3f3f3f;int n,m,g[N][N],d[N],level[N];bool st[N];in原创 2021-11-12 17:13:34 · 1441 阅读 · 0 评论 -
拓扑排序的应用
由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。于是Mr.Z下令召开 m 方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工 a 的奖金应该比 b 高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元,且必须是整数。输入格式第一行包含整数 n,m ,分别表示公司内员工数以及参会代表数原创 2021-11-12 13:39:09 · 396 阅读 · 0 评论 -
拓扑排序模板
拓扑排序用于有向无环图。维护一个队列,其中的元素都是入度为0的结点,每次取出队头的元素,枚举它连接的每一个点,将那些入度减一,如果有结点入度减到了0,加入队列,那么队列中入队的顺序即为拓扑序,拓扑序不唯一。由于需要入队的顺序,所以用手写队列直接在队列数组中记录拓扑序,q[0] - q[n - 1]的顺序即为拓扑序。const int N = 110,M = N * N;int n,d[N],q[N];int h[N],e[M],ne[M],idx;//d表示入度void topu.原创 2021-11-12 11:28:44 · 206 阅读 · 0 评论 -
最小生成树模板
可用于带重边、自环以及负权的无向图。Prim算法:每次选出一个离集合最近的点,加入集合,依次类推,直到最小生成树的建成。有两个版本,朴素版本复杂度:O(N2),堆优化版本复杂度:O(mlogm)。由于kruskal更常用,只贴一个朴素版本的模板。int prim(){ memset(d,0x3f,sizeof(d)); int res = 0; for(int i = 0; i < n; i ++ ) { int t = -1; .原创 2021-11-12 11:12:00 · 108 阅读 · 0 评论