从外地学习回来,我对图论才有认识(以前就没接触过,非常尴尬),说实话,学好图论的重要性,就像学数学时在进行解析几何时,图极有可能是打开答案的最后秘钥,也就是数形结合,而懂的人永远明白,用图解决绝对比用解析简单(一般情况)。而图论对于oi选手说,就是一大杀器,有可能利己,也可能抱憾终身。所以说图论的重要性就很显然了。

大家在进入图论的时候,应该先掌握链式前向星建图,当然也可以叫邻接表,先附上我喜欢的模板

  1. struct node{
  2. int next,to,w;
  3. }edge[maxn<<4];
  4.  
  5. int head[maxn],cent;
  6.  
  7. void add(int u,int v,int w){
  8. edge[++cent]=(node){head[u],v,w}; head[u]=cent;
  9. }

  

  ——所谓模板,也就是自己喜欢的颜色涂上而已。

  当然还有一些其他知识,比如说vector建图,这种建图的方式优点是难度小,而且还可以排序,这个在NOIP2018的D2T1上有极大优势。

  1. scan(a),scan(b);
  2. vec[a].push_back(b);
  3. vec[b].push_back(a);

  然后只要简单地定义排序一下,即可用食。

  还有树形dp,这在树形图中将是一大助力,这里是dp求直径。

  1. void dp(int s,int fa){
  2. for(int i=head[s];i;i=edge[i].next){
  3. int y=edge[i].to;
  4. if(vi[y]) continue;
  5. if(y==fa) continue;
  6. dp(y,s);
  7. an=max(anx,root[x]+root[y]+edge[i].w);
  8. root[s]=max(root[s],root[y]+edge[i].w);
  9. }
  10. }

  在入门之后,请仔细思考与总结

  总结方法:

  1. 反向建边 例题

  2. 路径记数,加法原理,并加上限制条件 例题

  3. 巧妙运用二分图的检验 例题

  4. 学习二分图的技巧,学会在只有两种条件有关系时,转化成二分图 例题

  5. 深刻理解floyd的逐个点处理 例题

  6. 二分答案对于路径长度和其他条件的单调性处理 如4中例题

  7. 分清SPFA(没死透)和Dij两者各自的优势,注意负环

  8. 在最小生成树中,注意prim和kruskal各自的优势 例题1 例题2

  9. 差分约束 SPFA的独特优势(牢记系统约束) 例题

  10. 在连通性中巧用度(即入度和出度) 例题

  11. 善于建超级原点

  (欢迎评价添加)

  拓展性模板

  在二分图中,匈牙利算法虽好,但是毕竟抵不过网络流做法,这里是dinic模板

  1. #include<bits/stdc++.h>
  2. #define maxn 10008
  3. using namespace std;
  4. int n,m,head[maxn],s,t,cent=1,d[maxn],maxflow;
  5. int min(int a,int b){return a<b?a:b;}
  6. const int inf=1<<30;
  7. struct node{
  8. int next,to,w;
  9. }edge[maxn<<5];
  10. queue<int >q;
  11.  
  12. void add(int u,int v,int w){
  13. edge[++cent]=(node){head[u],v,w};head[u]=cent;
  14. edge[++cent]=(node){head[v],u,0};head[v]=cent;
  15. }
  16.  
  17. bool bfs(){
  18. memset(d,0,sizeof d);
  19. while(q.size()) q.pop();
  20. q.push(s),d[s]=1;
  21. while(!q.empty()){
  22. int x=q.front();q.pop();
  23. for(int i=head[x];i;i=edge[i].next){
  24. int y=edge[i].to;
  25. if(edge[i].w&&!d[y]){
  26. q.push(y);d[y]=d[x]+1;
  27. if(y==t) return 1;
  28. }
  29. }
  30. }
  31. return 0;
  32. }
  33.  
  34. int Dinic(int x,int flow){
  35. if(x==t) return flow;
  36. int rest=flow,k,y;
  37. for(int i=head[x];i;i=edge[i].next){
  38. if(edge[i].w&&d[y=edge[i].to]==d[x]+1){
  39. k=Dinic(y,min(rest,edge[i].w));
  40. edge[i].w-=k;
  41. edge[i^1].w+=k;
  42. rest-=k;
  43. }
  44. }
  45. return flow-rest;
  46. }
  47.  
  48. int main(){
  49. scanf("%d%d%d%d",&n,&m,&s,&t);
  50. for(int i=1,a,b,w;i<=m;i++){
  51. scanf("%d%d%d",&a,&b,&w);
  52. add(a,b,w);
  53. }
  54. int flow=0;
  55. while(bfs())
  56. while(flow=Dinic(s,inf)) maxflow+=flow;
  57. printf("%d",maxflow);
  58. }

  

  缩点

  在联通性中,缩点是必要的

  1. #include<bits/stdc++.h>
  2. #define maxn 10007
  3. using namespace std;
  4. int n,m,head[maxn],a[maxn],cent,stackk[maxn],cnt,tot[maxn],col[maxn];
  5. int dfn[maxn],low[maxn],t,vis[maxn],top,root[maxn],ans;
  6. inline int max(int a,int b){return a>b?a:b;}
  7. inline int min(int a,int b){return a<b?a:b;}
  8. struct node{
  9. int next,to,from;
  10. }edge[maxn<<5];
  11.  
  12. void add(int u,int v){
  13. edge[++cent]=(node){head[u],v,u};head[u]=cent;
  14. }
  15.  
  16. void Tarjan(int x){
  17. dfn[x]=low[x]=++t;vis[x]=1;
  18. stackk[++top]=x;
  19. for(int i=head[x];i;i=edge[i].next){
  20. int y=edge[i].to;
  21. if(!dfn[y]){
  22. Tarjan(y);
  23. low[x]=min(low[x],low[y]);
  24. }else if(vis[y]) low[x]=min(low[x],dfn[y]);
  25. }
  26. if(low[x]==dfn[x]){
  27. cnt++;int z;
  28. do{
  29. z=stackk[top--];
  30. col[z]=cnt;
  31. vis[z]=0;
  32. tot[cnt]+=a[z];
  33. }while(z!=x);
  34. }
  35. }
  36.  
  37. void dp(int x,int fa){
  38. root[x]=tot[x];int ol=0;
  39. for(int i=head[x];i;i=edge[i].next){
  40. int y=edge[i].to;
  41. if(y==fa) continue;
  42. dp(y,x);
  43. ans=max(ans,root[y]+root[x]);
  44. ol=max(ol,root[y]);
  45. }
  46. root[x]+=ol;
  47. }
  48.  
  49. int main(){
  50. scanf("%d%d",&n,&m);
  51. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  52. for(int i=1,a,b;i<=m;i++){
  53. scanf("%d%d",&a,&b);
  54. add(a,b);
  55. }
  56. for(int i=1;i<=n;i++){
  57. if(!dfn[i]) Tarjan(i);
  58. }
  59. memset(head,0,sizeof(head));
  60. for(int i=1;i<=m;i++){
  61. int x=edge[i].from,y=edge[i].to;
  62. if(col[x]!=col[y]){
  63. add(col[x],col[y]);
  64. }
  65. }
  66. for(int i=1;i<=cnt;i++){
  67. if(root[i]) continue;
  68. dp(i,0);
  69. ans=max(root[i],ans);
  70. }
  71. printf("%d",ans);
  72. return 0;
  73. }

  之后还有许多基础性的知识在以后会看到。

简谈图论重要性&&图论总结的更多相关文章

  1. .NET简谈接口

    自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...

  2. .NET简谈构件系统开发模式

    转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...

  3. .NET简谈——跨进高级编程门槛的必经之路

    我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用:为了延续基础知识学习的热情,我编写了这篇特殊的文章. 本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下 ...

  4. 简谈Java语言的继承

    Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...

  5. 简谈Java语言的封装

    简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...

  6. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

  7. 简谈DFS

    所谓DFS就是“不撞南墙不回头”的一种搜索.其时间复杂度为O(V+E). 能算出从起点到终点的全部路径,在算法执行的过程中需要一个visit[vi]数组来维护每个结点的访问情况,这样就能避免重复访问. ...

  8. ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化

    首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...

  9. 简谈HTML5与APP技术应用

    HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...

随机推荐

  1. Petalinux和Vivado的安装

    Petalinux和Vivado的安装 背景 我是搞软件的, FPGA这块不太了解.由于机缘巧合,最近有接触到这块的开发.所以先挖一坑. 先声明我不是专业搞这块的,所以对这块的内容理解可能会有偏差,以 ...

  2. 发现一个怪象windows 7系统上老是丢包windows 10网络正常

    不知何故障,同一个局域网,windows 10系统上不丢包,windows 7系统老是丢包,不知是不是这二个系统的差区别,还是大家都有这样的情况. 相互PC之间ping也又不丢包,只有windos 7 ...

  3. 【SpringBoot1.x】SpringBoot1.x 安全

    SpringBoot1.x 安全 文章源码 环境搭建 SpringSecurity 是针对 Spring 项目的安全框架,也是 SpringBoot 底层安全模块默认的技术选型.他可以实现强大的 we ...

  4. SonarQube学习(六)- SonarQube之扫描报告解析

    登录http://192.16.1.105:9000,加载项目扫描情况 点击项目名称,查看报告总览 开发人员主要关注为[问题]标签页. 类型 主要关注为bug和漏洞. 其中bug是必须要修复的,漏洞是 ...

  5. 【Java】面向对象

    重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-面向对象 都是视频课件里的. 文章目录 面向对象 什么是对象 什么是面向对象 类 什么是对象的属性和方法 类 ...

  6. LeetCode671. 二叉树中第二小的节点

    题目 纯暴力 1 class Solution { 2 public: 3 vector<int>ans; 4 int findSecondMinimumValue(TreeNode* r ...

  7. 干电池1.5V升压3.3V芯片电路图

    1.5V升压3.3V的芯片 PW5100 是一款大效率.10uA低功耗.低纹波.高工作频率1.2MHZ的 PFM 同步升压 DC/DC 变换器.输入电压可低0.7V,输入电压范围0.7V-5V之间,输 ...

  8. Effective Java, 3e阅读笔记一

    引言 本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库,适用于任何具有实际Java工作经验的程序员. 本书一共90个条目,12章,每个条目讨论一条规则,这些规则反映了最有经验的优秀程序员 ...

  9. k8s-jenkins持续发布tomcat项目

    k8s-jenkins持续发布tomcat项目 一.需求 这个实验前期后后搞了很久(公司经常插一些别的事过来,然后自己比较懒,再加上自己知识不够扎实).二进制部署完k8s集群就开始做jenkins持续 ...

  10. 使用Azure Runbook 发送消息到Azure Storage Queue

    客户需要定时发送信息到Azure Storage Queue,所以尝试使用Azure Runbook实现这个需求. 首先新增一个Azure Automation Account的资源. 因为要使用Az ...