图论

图论之邻接表的数组实现

可紊 提交于 2019-11-26 22:25:04
虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷; 当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来; 这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了——邻接表,当然使用vector数组也是一种良好的选择; 邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法; 首先,有三个数组,分别为u[max],v[max],w[max]分别代表着每条边的起点,终点,权重,而下标则代表着边的编号; 然后设立first[max],next[first]这两个数组; first数组存储的是边的编号,下标代表的是边的起始结点; next数组存储的是编号为i的前一条边的编号,其中i就是下标; 那么插入一条边的过程就是这样的: 首先将边读入到u,v,w这三个数组中; 然后根据u找到first数组中下标为u的那栏,如果为空,就将边的编号直接加入其中,否则,将这编号放入对应的next数组中,将first数组中存新加入的结点编号; int n,m;//结点数目,边的数目 int u[1000],v[1000],w[1000];//边的起点,终点,权重 int first[1000],next[1000]; cin>>n>>m; for(int i=1;i<=n;++i) { first[i]=-1;//将

【图论】数组模拟邻接表存储(链式前向星)

梦想与她 提交于 2019-11-26 22:22:48
图的邻接表存储法 又叫链式存储法 可以用数组模拟 定义 struct edge{ int next; //下一条边的编号 int to; //这条边到达的点 int dis; //这条边的长度 }edge[size]; //COYG 核心代码 加入一条从from到to距离为dis的单向边 inline void add( int from , int to, int dis) { edge[++num].next=head[ from ]; edge[num].to=to; edge[num].dis=dis; head[ from ]=num; } //COYG 举一个例子吧 别喷图 图上每一个边上的数字 既是编号 也是长度 就是这样一个简单图 按照上面的代码 存储完之后各数组的情况是这样的 next数组是这样存的:对于一条边 假如之前已经加入过与这条边同一起点的边 则储存最靠后的同起点边的编号 如果之前没有加入过任何与这条边同起点的边 则next数组的值为0 dis数组是存储的当前这条边的长度 to数组很好理解 它存储的就是你现在输入的这条边的末端点 head[i]代表第i个点为端点连接的最后一条边的编号 主要要点就这些 继续努力 来源: CSDN 作者: ars4me 链接: https://blog.csdn.net/qq_36303472/article/details

图论---邻接矩阵

巧了我就是萌 提交于 2019-11-26 22:20:06
一、图的定义 图是由顶点集合(Vertex)及顶点间的关系集合组成的一种数据结构:Graph=( V, E ) V = {x | x ∈某个数据对象 } 是顶点的有穷非空集合; E ={ (x, y) | x, y ∈V } 是顶点之间关系的有穷集合,也叫做边(Edge)集合。 注:∈为数学符号,表示属于的意思 。例:x∈y:表示x属于y的意思。 在图中的数据元素通常称为顶点 V 。 注意: 1、二叉树和线性表也符合图的特征。二叉树的所有结点相当于顶点的集合,结点间都存在一定的关系;线性表也是一样,也就是说二叉树和线性表是特殊的图。只不过图比线性表和树更加复杂罢了。 2、在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中的一个元素相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。 二、基本术语 1、无向边 :若顶点 x 和 y 之间的边没有方向,则称该边为无向边(x, y),(x, y) 与 (y,x) 意义相同,表示 x 和 y 之间有连接。 2、无向图 :若图中任意两个顶点之间的边均是无向边,则称该图为无向图。 3、有向边 :若顶点 x 和 y 之间的边有方向,则称该边为有向边<x, y>,<x, y

图论------创建邻接表图,打印邻接表图,无权最短路径输出函数

╄→尐↘猪︶ㄣ 提交于 2019-11-26 22:19:31
// 图论算法 // #include "stdafx.h" #include <iostream> #include <queue> #include <stack> #include <vector> using namespace std; typedef struct vertex { int v; int Known; int Distance; int PreVertex; int Weight; vertex *next; }vertex; vertex *V[ 100 ]; //全局变量 /********************** 功能:创建无权邻接表 输入:顶点个数 输出:邻接表指针数组 **********************/ void createVertexNoWeight( int N) { vertex *q, *p; for ( int j = 0 ;j < N;j++) { int k; cin >> k; V[j] = new vertex; p = V[j]; V[j]->v = j; V[j]->Distance = 888888 ; V[j]->Known = 0 ; for ( int i = 0 ;i < k;i++) { int temp; cin >> temp; //第j个邻接表的顶点个数 q = new vertex;

图论之一些好题(8.10)

我与影子孤独终老i 提交于 2019-11-26 22:12:13
数据范围:O(n 3 ) 弗洛伊德跑出两两之间的最短路 然后加一加判一判 跑单源最长路 复杂度:O(n 2 logn) 因为边数是n 2 的 先跑一遍1为源点的最短路 再建一张把所有有向边都反过来的最短路(1还是源点)来跑 一: 在跑dij的时候在维护的数里面再塞一个当前的费用,当费用>k的时候就不更新(下一个) 二: 建n*k个点的图 然后跑个dij ①:二分答案,把大于等于二分的答案的边加进图中,判是否连通 ②:跑dij,更新条件换成if(d[v]>min(d[u],w)) d[v]=min(d[u],w) ③:kruskal找最大生成树,当点1和点n第一次连通的时候,加的那条边就是答案 这里酋长的等级不一定是最高的 边权是优惠后的价格 由贵的物品向便宜的物品建边(边权是优惠的价格),从1点开始跑最短路,dis[i]+i的原价是最小价格 考虑等级限制: 枚举等级的区间[l,l+m],其中一定包含酋长的等级 然后枚举的每一个区间跑一次dij 注意人的等级是分散的(类似[1,10]和[2,11]里面包含的人是一样的),所以可以以人的等级为左端点 这样就是n次dij,n<=100 复杂度还是承受的了的 显然dij被卡爆了 于是我们可以想到一些奇技淫巧 线段树实现dij怎么样? 恐惧.jpg 我们想想怎么优化dij 我们发现priority_queue里面会有很多冗余节点,我们可以合并

DP&图论 DAY 5 下午

无人久伴 提交于 2019-11-26 20:14:27
DP&图论 DAY 5 下午 树链剖分 每一条边要么属于重链要么轻边 证明: https://www.cnblogs.com/sagitta/p/5660749.html 轻边重链都是交替走的(此处重链可以走若干条边) 1.dfs1 统计子树大小,确定重儿子 2.dfs2 找重链 重链,子树,分别是连续的一段 每个结点属于一个重链 ta < tb a 跳到 ta 的父节点 logn 级别 将树序列化 SPOJ QTREE Query on a tree Solution 树链剖分 + 线段树维护区间最大值 BFS 树链剖分 边权摊到点上 BZOJ 1036 树的统计 Solution BZOJ 4034 有一棵点数为 N 的树,以点 1 为根,且树点有权。然后有 M 个操作,分为三种: 1. 把某个节点 x 的点权增加 a 。 2. 把某个节点 x 为根的子树中所有点的点权都增加 a 。 3. 询问某个节点 x 到根的路径中所有点的点权和。 Solution 单点加 区间修改 区间查询 BZOJ 2243 染色 Solution 同时维护区间左右端点颜色 若相同,左右颜色段数相加-1 不相同,直接加起来 BZOJ 2238 MST Solution 1.对于m-n+1条非最小生成树上的边,不会对原来的最小生成树产生影响,直接出结果 2.对于最小生成树上的边,用别的来替代 强连通分量

DP&图论 DAY 5 上午

空扰寡人 提交于 2019-11-26 19:47:11
DP&图论 DAY 5 上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向 的通信路径。现在有一个消息要由某个人开始传递给其他所有 人,问应该由哪一个人来传递,才能在最短时间内让所有人都接 收到消息。 Solution 全局最短路 Floyd POJ 1502 MPI Maelstrom 给出 N 个处理器之间传递信息所需时间矩阵的下三角,求信息 从第一个处理器传到其它所有处理器所需时间最大值。 Solution 单源最长路 dij(n m logn) n^2 logn POJ 1511 Invitation Cards N 个点 M 条边的有向图,询问对于所有 i ,从点 1 出发到点 i 并 返回点 1 所需时间最小值。 Solution # 正向建图 + 单源最短路 # 反向建图 + 单源最短路 ,所以就是把有向边反过来,从点1出发 dij 其实是反向最短路 POJ 1724 ROADS 有 N 个城市和 M 条单向道路,每条道路有长度和收费两个属性。 求在总费用不超过 K 的前提下从城市 1 到城市 N 的最短路。 Solution Dijkstra ,同时维护当前路径总费用,超过费用上限的状态不再转移 对于每个点拆成k个点,(u,0),(u,1),.......(u,k) 分层图 POJ 1797

[图论DFS][dp]leetcode494:目标和

倖福魔咒の 提交于 2019-11-26 19:14:26
题目: 解题思路: 1)利用动态规划解题: 1.每个元素可看作一个物品,+1表示将此物品取出,-1表示将此物品放回 2.sum表示将所有物品全部取出,sum+S表示有些物品取出两次,有些物品取出后又放回,这样就是表示+1的有两次,除以2就是+1的取出一次。 3.本题本质和01背包一样的,利用动态规划解题 2)使用DFS穷举所有可能的情况,暴搜+剪枝 代码如下: class Solution { public : int findTargetSumWays ( vector < int > & nums , int S ) { /*解法1:利用dp*/ /* int sum=0; for(auto num:nums)//求总和 sum+=num; if(sum<S||(sum+S)%2==1)return 0; sum=(sum+S)/2; vector<int> dp(sum+1,0);//dp[i]表示重量i的情况数 dp[0]=1; for(auto num:nums)//进行动态规划 for(int i=sum;i>=num;--i) dp[i] += dp[i-num]; return dp[sum]; */ /*解法2:深度优先搜索+剪枝*/ int result = 0 ; DFS ( nums , 0 , S , 0 , result ) ; return

图论--网络流--最大流 POJ 2289 Jamie's Contact Groups (二分+限流建图)

微笑、不失礼 提交于 2019-11-26 18:27:02
Description Jamie is a very popular girl and has quite a lot of friends, so she always keeps a very long contact list in her cell phone. The contact list has become so long that it often takes a long time for her to browse through the whole list to find a friend's number. As Jamie's best friend and a programming genius, you suggest that she group the contact list and minimize the size of the largest group, so that it will be easier for her to search for a friend's number among the groups. Jamie takes your advice and gives you her entire contact list containing her friends' names, the number of

poj 3436 ACM Computer Factory 【图论-网络流-最大流-EK-输出路径】

老子叫甜甜 提交于 2019-11-26 18:26:40
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Special Judge Description As you know, all the computers used for ACM contests must be identical, so the participants compete on equal terms. That is why all these computers are historically produced at the same factory. Every ACM computer consists of P parts. When all these parts are present, the computer is ready and can be shipped to one of the numerous ACM contests. Computer manufacturing is fully automated by using N various machines. Each machine removes some parts from a half-finished computer and adds some new parts (removing