1.什么是超级源点与超级汇点

(1)超级源点跟超级汇点是模拟出来的虚拟点,多用于图中 :

<1>同时有多个源点和多个汇点,建立超级源点和超级汇点

<2>同时有多个源点和一个汇点,建立超级源点

<3>同时有多个汇点和一个源点,建立超级汇点

(2)我们平时所做的算法多是适用于一个源点到一个汇点或者是一个源点到多个汇点的类型,但是如果出现多个源点对应多个汇点时,我们会不知所措。跑多遍算法?那样会TLE,换个思维,既然是从多个源点出发到多个汇点,我们能不能建立一个点来代替多个源点/汇点 的效果,而又不影响答案。

2.例题1  HDU2680 Choose the best route(Dijkstra  + 建立超级源点)

(1)题意:给出你n个点,m条有向边,每条路都有时间花费,给你一个终点,多个起点,问你从起点到终点的最小时间花费是多少。

(2)分析:一眼看破最短路

但是最短路Floyed算法O(n^3)会超时 , Dijkstra算法只能求单源点,这里是多源点单汇点。

<1>思路一:逆向跑Dijkstra,终点当起点。

<2>思路二:能到要跑多次Dijkstra?那是肯定不行的。既然是多个源点,我们要求这些源点里到汇点最短的。我们可以建立一个虚拟的源点,链接所有的起点,但是路径长度为0!然后跑从超级源点到汇点这(n+1)个点的最短距离即可!(妙,喵喵喵)

(3)代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int> P;
typedef long long LL;
const int maxn = 40000 + 7;
struct Edge{int to,next,val;
}edge[maxn];
int n,m,s,w,tot,head[1010],dist[1010];
bool vis[1010];
void addEdge(int a,int b,int c){edge[tot].to = b;edge[tot].val = c;edge[tot].next = head[a];head[a] = tot++;
}
void Dijkstra(int a){dist[a] = 0;memset(vis,0,sizeof(vis));priority_queue<P,vector<P> , greater<P> > que;que.push(P(0,a));while(!que.empty()){P p = que.top();que.pop();if(vis[p.second])continue;vis[p.second] = 1;for(int i = head[p.second];~i;i = edge[i].next){if(!vis[edge[i].to]&&dist[edge[i].to] > dist[p.second] + edge[i].val){dist[edge[i].to] = dist[p.second] + edge[i].val;que.push(P(dist[edge[i].to],edge[i].to));}}}
}
int main()
{while(scanf("%d%d%d",&n,&m,&s)!=EOF){tot = 0;memset(head,-1,sizeof(head));memset(dist,INF,sizeof(dist));for(int i = 0;i<m;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);addEdge(a,b,v);//有向边}scanf("%d",&w);for(int i = 0;i<w;i++){int p;scanf("%d",&p);addEdge(0,p,0);//超级源点0,连接所有源点,长度为0}Dijkstra(0);if(dist[s]==INF)printf("-1\n");else printf("%d\n",dist[s]);}return 0;
}

3.例题2:Poj1459 Power Network(最大流 + 建立超级源点与超级汇点)

(1)题意:有三种节点:一种是发电厂,只产生电量不消耗电量;一种是用户,只消耗电量不产生电量;一种是变压器,既不产生也不消耗。给出n个节点,m条电路,每条电路都有电量限制。现在问你供电网络中传给用户的最大电量是多少。

(2)分析:多个发电厂相当于多个源点,多个用户相当于多个汇点。题意转化为求从多个源点到多个汇点的最大电量之和。

建立超级源点0,超级汇点n+1,超级源点连接所有的源点,路径容量为发电厂的产电量;所有的汇点连接超级汇点,路径容量为用户的耗电量。然后跑一边从超级源点到超级汇点的最大流即可!

(3)代码:

#include <iostream>
//#include<bits/stdc++.h>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 100 + 7;
struct Edge{int to,next,cap,flow;
}edge[maxn*maxn*2];
int n,np,nc,m,tot,head[maxn],dist[maxn],cur[maxn];
void addEdge(int a,int b,int c){edge[tot].to = b;edge[tot].next = head[a];edge[tot].cap = c;edge[tot].flow = 0;head[a] = tot++;edge[tot].to = a;edge[tot].next = head[b];edge[tot].cap = 0;edge[tot].flow = 0;head[b] = tot++;
}
bool BFS(int s,int t){//BFS分层图memset(dist,0,sizeof(dist));dist[s] = 1;queue<int> que;que.push(s);while(!que.empty()){int u = que.front();que.pop();for(int i = head[u];~i;i = edge[i].next){int p = edge[i].to;if(!dist[p]&&edge[i].cap > edge[i].flow){dist[p] = dist[u] + 1;que.push(p);}}}if(!dist[t])return false;return true;
}
int DFS(int p,int e,int minFlow){//DFS找增广路if(p==e||minFlow==0)return minFlow;int f = 0;for(int &i = cur[p];~i;i = edge[i].next){int v = edge[i].to;if(dist[v] == dist[p] + 1&&edge[i].cap > edge[i].flow){int dis = DFS(v,e,min(minFlow,edge[i].cap - edge[i].flow));minFlow-=dis;f+=dis;edge[i].flow+=dis;edge[i^1].flow-=dis;if(minFlow==0)break;}}return f;
}
int Dinic(int s,int t){//Dinic算法if(s==t)return 0;int flow = 0;while(BFS(s,t)){for(int i = 0;i<=n+1;i++)cur[i] = head[i];//当前弧优化int ans = DFS(s,t,INF);flow+=ans;}return flow;
}
int main()
{while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){tot = 0;memset(head,-1,sizeof(head));for(int i = 0;i<m;i++){int a,b,v;scanf(" (%d,%d)%d",&a,&b,&v);addEdge(a+1,b+1,v);//连接普通电路}for(int i = 0;i<np;i++){int a,v;scanf(" (%d)%d",&a,&v);addEdge(0,a+1,v);//所有源点链接超级源点,容量为供电量}for(int i = 0;i<nc;i++){int a,v;scanf(" (%d)%d",&a,&v);addEdge(a+1,n+1,v);//所有汇点连接超级汇点,容量为耗电量}int maxflow = Dinic(0,n+1);//跑最大流printf("%d\n",maxflow);}return 0;
}

图论技巧 : 超级源点与超级汇点的建立相关推荐

  1. 《网络流学习笔记04 NYOJ 489 哭泣天使(建边,超级源点和汇点)》

    链接:click here 题意描述: 哭泣天使 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 5 描述 Doctor Who乘着Tardis带着Amy来到了一个星球,一开 ...

  2. 解题报告:POJ - 1062 昂贵的聘礼(最短路、超级源点)

    整理的算法模板合集: ACM模板 AcWing 903. 昂贵的聘礼 [思路] 由于本题只有终点,没有起点,所以我们建一个超级源点S=0S = 0S=0 ,源点与各各点的权值就是他们的价格 如下图所示 ...

  3. 最短路多起点多终点(超级源点)

    我们先来回忆一下spfa判负环的思想: 就是先把所有的点入队列,然后用一个一个点去枚举边去松弛点与点之间的距离,顺便记录一下被松弛点的最短路径所经过的边数,如果发现一个点的最短路径边数大于等于n(n为 ...

  4. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  5. D.引水工程 【最小生成树+超级源点】

    D.引水工程 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 10 [Submit][Status][Web Board] Desc ...

  6. 【图论技巧】点边转化(拆点和拆边)

    目录 一.总述 二.常见的有针对性的算法 - 针对点权 - 针对边权 三.拆点 - 过程 - 实例 - 网络流 四.拆边 - 过程 - 实例 - 倍增算法(Kruskal 重构树) - LCT 维护最 ...

  7. 艾永亮:为什么企业都在追求超级产品,超级产品的意义是什么?

    产品创新不能靠想象,企业不能只停留在想的层面上,而是要打造超级产品实现落地. 一.创新的意义 什么是创新 关于创新其实是基于各种现有的元素进行的组合,企业所创新的产品不是凭空出现的,引用一句话,&qu ...

  8. 电子书籍下载大汇总,超级经典,超级汇总!

    电子书籍下载大汇总,超级经典,超级汇总! <Visual C++ 2005入门经典中文版 红皮书 PDF> java爱好者必备--JAVA解惑(中文版PDF) 一本关于Solaris系统的 ...

  9. linux搭建vds超级节点,VDS | 超级节点搭建流程

    没有中心化的束缚 只有前所未有的自由在VDS生态中,超级主节点的创建将为参与者带来可观的 Vollar收益.随着Ⅴollar收益的增加,越来越多的参与者将逐渐了解其价值,从而为获得更多的Ⅴollar, ...

最新文章

  1. 张小龙宣布微信小程序可直接从桌面进入
  2. 10、 HAVING:过滤分组
  3. mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义
  4. python的if循环语句_第二个是Python的循环语句,基础,使用,if,条件,判断,while,for
  5. ip复原Java_Java实现 LeetCode 93 复原IP地址
  6. SQL Server 日期函数
  7. 【搬运】不思议的小故事,其实舰娘们也是有灵性的
  8. 初试小刀自我简历小程序
  9. 多目标灰太狼算法求解环境经济调度问题(IEEE30)(Matlab实现)
  10. android netd分析
  11. Zabbix Server trapper 命令注入漏洞 (CVE-2017-2824)
  12. 和优化大师一样的软件_手机里系统自带的软件无法卸载?教你一招,摆脱“流氓软件”!...
  13. 杜君立:紧箍咒与纸枷锁
  14. 关于戴尔台式机需要重启电脑才能识别耳机的问题解决
  15. hardware用u盘起动_Mac 老设备如何利用U盘启动 Apple Hardware Test (AHT) 硬件检测工具...
  16. Web Service与CORBA
  17. 【第55题】输入、输出系列3-文件的天下大势
  18. 二次元博客php,分享wordpress自适应动漫二次元PureViper博客主题
  19. 前特斯拉核心技术专家谷俊丽加入小鹏汽车
  20. Python心经(1)

热门文章

  1. 微星主板黑苹果_游戏机也玩二次元!微星全新“钛舞Diana”点亮冬日激情_家用电脑...
  2. 从路由器查看计算机访问记录,手机通过wifi连接路由上网,管理员能通过电脑终端看到浏览的内容或记录吗?...
  3. 当阿里、腾讯、京东混战,谁才是新零售的“关键先生”?
  4. 单例模式之饿汉、懒汉模式
  5. electron+vue使用electronedge.dll换桌面壁纸
  6. 根据周次显示日期范围_Power BI动态技巧,利用DAX显示最近N天的数据
  7. oracle列转行查询,Oracle列转行函数Listagg以及pivot查询示例
  8. 网络安全人才就业前景如何?网络空间安全未来就业前景和就业方向?
  9. HTTPS加密对中小微客户的价值?
  10. 【视觉SLAM十四讲】三维空间刚体运动