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

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

从源点开始遍历未满流的边,这些边两端节点的集合称为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. Entity Framework -- 添加,删除,修改,关系依附,关系摘除,验证操作

    数据库模型 这个基本上是浓缩 Jerry Tom博客的内容,作为参考http://www.cnblogs.com/mbailing/archive/2012/07/31/2616779.html 说明 ...

  2. MYSQL 45道练习题

    学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用S ...

  3. UID卡、CUID卡、FUID卡的区别

    UID卡(国外称GEN1) 所有区块可被重复读写 卡片ID可改且使用后门指令更改ID ID可被重复修改 响应后门指令(意味着可被使用后门指令检测是否为克隆卡的机器发现) CUID卡(国外称GEN2) ...

  4. 【sqli-labs】 less26a GET- Blind based -All you SPACES and COMMENTS belong to us -String-single quotes-Parenthesis(GET型基于盲注的去除了空格和注释的单引号括号注入)

    这个和less26差不多,空格还是用%a0代替,26过了这个也就简单了 ;%00 可以代替注释,尝试一下 order by 3 http://192.168.136.128/sqli-labs-mas ...

  5. sql server 查询数据判断为空

    and xxx is NOT null and xxx is null

  6. PAT_A1034#Head of a Gang

    Source: PAT A1034 Head of a Gang (30 分) Description: One way that the police finds the head of a gan ...

  7. apicloud 注意事项

    页面布局时头部和内容一定要分开,状态栏寖入式要用.可以用api.sendEvent广播出去,api.addlisterten监听. api.openWin打开页面会有黑色闪屏,加bgColor:'#f ...

  8. Lua习题练习(9*9乘法表,输出所指定的图像,斐波那契数列)

    1. (循环语句的嵌套使用)有 1,2,3,4四个数字,能组成多少个互不相同且无重复数字的 三位数,并输出在屏幕上面2. 计算斐波那携数列的前20个数字,并输出在屏幕上面 .指的是这样一个数列(1,1 ...

  9. windows的时间同步工具:w32time

    windows 客户端 官方文档自己排查可以看一下 如何在 Windows Server 中配置权威时间服务器 Windows Time Service Technical Reference Win ...

  10. Coloring Flame Graphs: Code Hues

    转自:http://www.brendangregg.com/blog/2017-07-30/coloring-flamegraphs-code-type.html I recently improv ...