题目大意:一个有源有汇的城市,问最少增加城市中的多少道路可以增加源到汇上各个路径上可容纳的总车流量增加。

网络流关键割边集合指如果该边的容量增加,整个网络流图中的任意从原点到汇点的路径的流量便可增加。

从源点开始遍历未满流的边,这些边两端节点的集合称为S;同理再从汇点开始遍历,集合称为T;其余的点组成另一个集合。如果一个边是最小割,则其两端属于不同的集合。如果一个边是关键割边,则该边两端节点一个属于S,一个属于T。遍历每一个图中的边,看它是否满足该条件即可。

#include <cstdio>
#include <cstring>
#include <cassert>
#include <cmath>
#include <algorithm>
using namespace std; const int NODE_MAX = 1100, EDGE_MAX = 10100, INF = 0x3f3f3f3f; //below:for dinic-----------------------------------------------------
struct Node;
struct Edge; struct Node
{
int Id, Vis;
int Level;
Edge *Head;
}; struct Edge
{
int Cap, Id;
Edge* Rev, *Next;
Node *From, *To;
}; Node _nodes[NODE_MAX];
Edge _edges[EDGE_MAX];
int _lastVId, _eCount = 0;
Node *StartNode, *TargetNode; void Init()
{
memset(_nodes, 0, sizeof(_nodes));
memset(_edges, 0, sizeof(_edges));
_eCount = 0;
} Edge *NewEdge()
{
return ++_eCount + _edges;
} void SetST(int sId, int tId)
{
StartNode = _nodes + sId;
TargetNode = _nodes + tId;
} void SetLastVId(int vId)
{
_lastVId = vId;
} Edge *AddEdge(Node *from, Node *to, int id, int cap)
{
Edge *e = NewEdge();
e->Id = id;
e->From = from;
e->To = to;
e->Cap = cap;
e->Next = e->From->Head;
e->From->Head = e;
return e;
} void Build(int uId, int vId, int id, int cap)
{
Node *u = uId + _nodes, *v = vId + _nodes;
u->Id = uId;
v->Id = vId;
Edge *e1 = AddEdge(u, v, id, cap);
Edge *e2 = AddEdge(v, u, -id, 0);
e1->Rev = e2;
e2->Rev = e1;
} struct NodeQueue
{
Node *q[NODE_MAX];
int head, tail;
void clear() { head = tail = 0; }
void push(Node *v) { q[tail++] = v; }
Node* front() { return q[head]; }
void pop() { head++; }
bool empty() { return head == tail; }
}; bool Bfs()
{
for (int i = 0; i <= _lastVId; i++)
_nodes[i].Level = 0;
NodeQueue q;
q.clear();
StartNode->Level = 1;
q.push(StartNode);
while (!q.empty())
{
Node *cur = q.front();
q.pop();
for (Edge *e = cur->Head; e; e = e->Next)
{
if (!e->To->Level && e->Cap)
{
e->To->Level = cur->Level + 1;
q.push(e->To);
}
}
}
return TargetNode->Level;
} int Dfs(Node *cur, int limit)
{
if (cur == TargetNode)
return limit;
if (limit == 0)
return 0;
int curTake = 0;
for (Edge *e = cur->Head; e; e = e->Next)
{
if (e->To->Level == cur->Level + 1 && e->Cap)
{
int nextTake = Dfs(e->To, min(limit - curTake, e->Cap));
e->Cap -= nextTake;
e->Rev->Cap += nextTake;
curTake += nextTake;
}
}
return curTake;
} int Dinic()
{
int ans = 0;
while (Bfs())
ans += Dfs(StartNode, INF);
return ans;
}
//above:for dinic----------------------------------------------------- void Dfs1(Node *cur)
{
assert(!cur->Vis);
cur->Vis = 1;
for (Edge *e = cur->Head; e; e = e->Next)
if (e->Cap && !e->To->Vis && e->Id > 0)
Dfs1(e->To);
} void Dfs2(Node *cur)
{
assert(cur->Vis != 1);
cur->Vis = 2;
for (Edge *e = cur->Head; e; e = e->Next)
if (e->Rev->Cap && !e->To->Vis &&e->Rev->Id > 0)
Dfs2(e->To);
} int main()
{
freopen("c:\\noi\\source\\input.txt", "r", stdin);
int totCity, totEdge;
scanf("%d%d", &totCity,&totEdge);
Init();
SetLastVId(totCity - 1);
SetST(0, totCity - 1);
int uId, vId, cap;
for (int i = 1; i <= totEdge; i++)
{
scanf("%d%d%d", &uId, &vId, &cap);
Build(uId, vId, i, cap);
}
Dinic();
Dfs1(StartNode);
Dfs2(TargetNode);
int eId[EDGE_MAX], pe = 0;
memset(eId, 0, sizeof(eId));
for (int i = 1; i <= _eCount; i++)
if (_edges[i].From->Vis == 1 && _edges[i].To->Vis == 2 && _edges[i].Id > 0)
eId[pe++] = _edges[i].Id;
sort(eId, eId + pe);
printf("%d\n", pe);
return 0;
}

  

POJ3204 Ikki's Story - Road Reconstruction 网络流图的关键割边的更多相关文章

  1. poj3204Ikki's Story I - Road Reconstruction(最大流求割边)

    链接 最大流=最小割  这题是求割边集 dinic求出残余网络 两边dfs分别以源点d找到可达点 再以汇点进行d找到可达汇点的点 如果u,v为割边 那么s->u可达 v->t可达 并且为饱 ...

  2. POJ3204 Ikki's Story I - Road Reconstruction

    Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7 ...

  3. POJ 3204 Ikki's Story I - Road Reconstruction

    Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7 ...

  4. POJ3184 Ikki's Story I - Road Reconstruction(最大流)

    求一次最大流后,分别对所有满流的边的容量+1,然后看是否存在增广路. #include<cstdio> #include<cstring> #include<queue& ...

  5. POJ 3204 Ikki's Story I-Road Reconstruction (网络流关键边)

    [题意]给定一个N个节点M条边的网络流,求有多少条边,使得当增其中加任何一个边的容量后,整个网络的流将增加. 挺好的一道题,考察对网络流和增广路的理解. [思路] 首先关键边一定是满流边.那么对于一个 ...

  6. POJ-3204-Ikki's Story I - Road Reconstruction(最大流)

    题意: 给一个有向图 求给那些边增加容量能增加总的流量,求边的条数 分析: 一开始求的是割边,结果wa了,那是因为有些割边增加了容量,但总的容量也不会增加 只有满流的边并且从源点汇点都有一条可扩展的路 ...

  7. 一起来全面解析5G网络领域最关键的十大技术

    提到5G,很多人的第一印象就是它的网络速度快.延时性低.带宽大,没错,这就是5G时代的特点!5G作为第五代移动通信网络,其峰值理论传输速度可达每秒数十Gb,这比4G网络的传输速度快数百倍,整部超高画质 ...

  8. UVA11248 网络扩容(枚举割边扩充)

    题意:      给你一个有向图,问你从1到n的最大流是多少?如果流量大于等于C那么直接输出一个串,否则输出只扩充一条边的流量就可以达到1->n大于等于C的所有边,如果扩充不了就输出另一个串.S ...

  9. [POJ3352]Road Construction(缩点,割边,桥,环)

    题目链接:http://poj.org/problem?id=3352 给一个图,问加多少条边可以干掉所有的桥. 先找环,然后缩点.标记对应环的度,接着找桥.写几个例子就能知道要添加的边数是桥的个数/ ...

随机推荐

  1. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

  2. java线程中断2

    一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.那么不 ...

  3. ViewPager PagerAdapter 的使用

    1: 目的,实现全屏滑动的效果 2:类似于BaseAdapter public class MyPagerAdapter extends PagerAdapter { private Context ...

  4. PCL: 根据几何规则的曲面剖分-贪婪法表面重建三角网格

    点云场景中进行物体识别,使用全局特征的方法严重依赖于点云分割,难以适应杂乱场景.使用局部特征,即对点云进行提取类似于3D SURF.ROPS之类的局部特征,需要寻找离散点云块的局部显著性. 点云的基本 ...

  5. 参加EMCL感想

    ECML,全名为欧洲机器学习会议,European Conference on Machine Learning 原文链接:http://blog.sina.com.cn/s/blog_59388e2 ...

  6. mysql 统计按天、星期、按月数据的各种 sql 语句 (转录)

    文章主要是作为知识整理,内容略有修改,方便以后查阅,内容转摘至 陈宇衡的个人博客,欢迎前去围观. 作为演示效果,先创建一个测试表,在插入两条数据(注:时间为 datetime 类型,unix 时间戳需 ...

  7. vue组件的拆分

    vue组件的拆分 <div class="div"> <!-- 拆分出来的组件 自定义名字moban --> <moban></moban ...

  8. python 从Excel中取值

    import openpyxl from openpyxl import load_workbook def open_file(file_path): workbook = load_workboo ...

  9. <a>标签中的href伪协议 标签: html 2016-12-24 22:38 365人阅读 评论(0)

    <a id="jsPswEdit" class="set-item" href="javascript:;">修改密码</ ...

  10. 深入C++的运算符重载

    对于简单的运算符,可以参考之前的博文.之后会有一篇关于从等号运算符重载的角度研究深浅拷贝的博文.这里是讲:逗号,取成员运算符,输入输出运算符,下标运算符,括号,new和delete的重载. 逗号运算符 ...