帝都Day6——图论
//P2O5呢?
一、图的存储:
邻接矩阵;邻接表。
邻接矩阵:n*n的[][],[i][j]节点有边记1没边0 缺点 空间复杂度O(n^2) 占用内存较大(我为什么要把这些东西写到这里呢???)
邻接表:把每一个点能直接到达的点存储成链表(反正是一个很奇怪的东西,弄懂了会写了会用了就行)单向边(为啥不叫有向边)和双向边(为啥不叫无向边)的区别是无向边反着存一遍再
const int N=1005;
const int M=10050;
int point[N],to[M],next[M],cc; void AddEdge(int x,int y)
{
cc++;
to[cc]=y;
next[cc]=point[x];
point[x]=cc;
}
void find(int x)
{
int now=point[x];
while(now)
{
printf("%d\n",now);
now=next[now];
}
}
int main()
{ }
图的遍历(?)(?)(?)——dfs,bfs
然后是最小生成树(MST问题)
铺锐母+客路思卡尔
客路思卡尔:
const int N=1050;
const int M=10050;
struct Edge
{
int a,b,c;
}edge[M];
int fa[N];//冰炸鸡
int n,m;
int ans=0;
int getf(int x)
{
if(fa[x]!=x)
fa[x] = getf(fa[x]);
return fa[x];
}
bool cmp(Edge x,Edge y)
{
return x.c<y.c;
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].c);
sort(edge+1,edge+m+1,cmp);
for(i=1;i<=n;i++)
fa[i]=i;
for(i=1;i<=m;i++)
{
int a=edge[i].a;
int b=edge[i].b;
a=getf(a);
b=getf(b);
if(a!=b)
{
ans+=edge[i].c;
f[a]=b;
}
}
printf("%d\n",ans);
}
然后是普利姆算法
首先染黑一个点。找一条边权最小的连接白点和黑点的点,把这个边连接的白点变为黑点,这条边加入MST。重复上述过程直到所有点都被染黑。所得的所有边和点就是MST。(woc我竟然写了段文字)代码:
(待更)
迟来的problems
vijos1190:繁忙的都市
这道题是最小瓶颈生成树,它的最大边权就是kruskal做出来最大边权(最后一个边权),所以直接用kruskal做就行了
bzoj1016:最小生成树计数
用kruskal,如果有边权一样的边,选哪条都试一试
最短路
福裸衣的,低阶死特辣,SPFA
Floyd-Warshall算法
SPFA(笔记被我吃了!)
Dijkstra(O(n^2))
Bellman-Ford O(n*m)一般不用。
problems(忽略s)
vijos1754
然后是:拓扑排序
代码:
(待更)
problems:
构造排列
构造一个1~n的排列,有m个限制,每个限制是:a要在b前面
要求字典序最小
n,m<=10^5
problemⅡ
构造一个1~n的排列,有m个限制,每个限制是:a要在b前面
要求1尽可能靠前,若仍有多解,要求2尽可能靠前,若仍有多解,要求3尽可能靠前(什么鬼续靠前)
lydsy4010(bzoj4010)
从后往前做,每次从所有可选的点中选出一个最大的。woc太巧妙了!!!!
代码迟早会更新的
(嗯,这里元素路径还是p)
afternoon-------------
强连通分量
在有向图中,如果a能到b,b能到a,就称ab强连通。
强连通图:有向图中每一对点都强连通,这个图就是强连通图。
强连通分量:有向图的极大联通子图,就是强连通分量。
任何一个有向图,都可以划分成若干个强连通分量,并且这些强连通分量没有交集。
重点来了!tarjan求 强连通分量
对图进行dfs,我们定义一个dfn[i] dfn[i]表示第i个节点是第几个被dfs到的
酱紫,我们每个节点都有个编号了
然后:low[i]表示他能到达的dfn最小的点的编号
在写tarjan的时候,我们要开一个栈
[tarjan code]
缩点:把一个图的每一个强连通分量变成一个点,变成DAG
有向无环图(DAG)拓扑排序只有在DAG上才有方案。
DP的状态之间关系如果用有向图来表示就是有向无环图,所以可以记忆化搜索!!
(难道所有DP都可以记忆化收索???)
强连通分量的作用,就是缩点,变成有向无环图,woc厉害了
victoria的舞会3 vijos1023
把“能通知到”关系抽象成有向图,然后缩点,求所有入度为0的点
tarjan+新图去重
[代码]
problems:
bzoj1051
建图,缩点,设t是出度为0的点的数量(t>0)
当t>1时,ans=0,因为那两个出度为0的点不能相互到达。
当t=1是,ans=那个出度为0的点对应的缩点前的点的数量。所有的点都能到那个点,也就是那个强连通分量里的所有的点都能被所有点到达。(这题还是比较H2O的)
Car的旅行路线 vijos1119(笔记被吃了)
联合权值 vjijos1906
30分、60分略,AC:枚举每一个点,枚举中间点。
寻找道路 vijos 1909
1.求哪些点与终点联通
2.求哪些点指向的点都与终点联通
3.在第二部满足条件的点上bfs最短路(因为权值1)
货车运输 vijos1843
最大生成树,只在最大生成树上找(kruskal反着排)
证明:只用最大生成树是足够的
设A,B,C三点之间互相有边连接,AB、AC在最大生成树中。设AC>AB或BC,那么AC应该在最大生成树中。所以AC<=AB和BC
华容道 vijos1846
程序思路先把空格子移动到要移动的格子(一下简称绿格子)旁边,然后(被吞了)(什么题目,这么难)
然后是一个树上倍增(被吞了)
欧拉路径:给出来一个图,把这个图的路径走一个遍。起点终点是同一个点:欧拉回路
蛤密顿路:把这个图的点走个遍。蛤密顿回路同欧拉回路
然后一个很奇怪的题,我又吞啦!
完。
帝都Day6——图论的更多相关文章
- 清北学堂dp图论营游记day6
xysq主讲: 求点双和边双代码: 对所有点进行染色,如果存在一种方案使得相邻的点不同色,那么他就是个二分图. 二分图两种求法,1,dfs求增广路. 2,网络流:最大流=最小割 差分约束: 下午又要考 ...
- Day6 && Day7图论
并查集 A - How Many Answers Are Wrong 题意:已知区间[1,n],给出m组数据,即[l,r]区间内数据之和为s,求错误数据的数量. 拿到这道题,真的没思路,知道用并查集, ...
- Python之路,Day6 - Python基础6
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- day6
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- [leetcode] 题型整理之图论
图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- 团队项目——站立会议DAY6
团队项目--站立会议 DAY6 团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱 今日(2016/5/13),站立会议已进行了一周时间,大家将这一周所遇到的问题和 ...
- 并查集(图论) LA 3644 X-Plosives
题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
随机推荐
- PL/SQL学习笔记_02_游标
在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. 为了处理 SQL 语句, ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处 ...
- (转)gcov、lcov与genhtml 使用心得
gcc是linux平台下的C.C++ 编译器 gcov是配合gcc产生覆盖信息报告的工具: lcov是将gcov产生的报告信息,以更直观的方式显示出来工具 基本的使用方法分为4个阶段: (一).gcc ...
- 微信菜单加emoji图标
1.https://icomoon.io/app/#/select----------------选择图标后进入 2. 笑脸表情可选择更多图标,左侧e901,是“字体码” 3.将图片复制件自定义菜单编 ...
- Linux下视频流媒体直播服务器搭建详解
目标: 搭建网络直播流媒体服务器系统(Linux操作系统) 背景: 用于OTT-TV大并发的直播和点播的一套流媒体服务器系统.支持N x 24小时录制回看和直播的服务器端解决方案. 解决方案: l ...
- jitter buffer QoS的解决方案
本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...
- bzoj 3533: [Sdoi2014]向量集 线段树维护凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...
- 配置 VS Code 调试 PHP
配置 VS Code 调试 PHP 1.下载 xampp 集成服务器wampserver3.1.0-Apache2.4.7_PHP5.6.3-7.0.23-7.1.19_MySQL5.7.19_Mar ...
- 向vivi中加入命令
在vivi的lib/command.c中添加自己的命令 核心数据结构user_command. typedef struct user_command { const char *name; ...
- CF 293E Close Vertices——点分治
题目:http://codeforces.com/contest/293/problem/E 仍旧是点分治.用容斥,w的限制用排序+两个指针解决, l 的限制就用树状数组.有0的话就都+1,相对大小不 ...
- Floyd-Warshall算法:求结点对的最短路径问题
Floyd-Warshall算法:是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包. 原理: Floyd-Warshall算法的原理是动态 ...