ECNU1101-Dinic
题意:从起点到终点有几条特殊路径。
特殊路径指的是:对于任意两条路径,他们的与起点相连的点是不同的点 && 与终点的相连的点是不同的点。

/*
题意:从起点到终点有几条特殊路径。
特殊路径指的是:对于任意两条路径,他们的与起点相连的点是不同的点 && 与终点的相连的点是不同的点。
思路:
把起点和后继节点的流量设置为1,同理对终点处理
这样在寻找最大流的增广路径时就会消除一条。。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
const int maxn = ;
const int maxm = maxn*maxn;
const int inf = 0x3f3f3f3f;
struct Edge{
int u,v,next,val;
}edge[ maxm ];
int cnt,head[ maxn ];
int q[ maxn+ ];
int lev[ maxn+ ]; void init(){
cnt = ;
memset( head,-,sizeof( head ) );
}
void addedge( int a,int b,int c ){
edge[ cnt ].u = a;
edge[ cnt ].v = b;
edge[ cnt ].val = c;
edge[ cnt ].next = head[ a ];
head[ a ] = cnt ++;
} bool bfs( int src,int dest,int n ){
int head2 = ,tail2 = ;
q[ tail2++ ] = src;
memset( lev,-,sizeof( lev ) );
lev[ src ] = ;
while( head2<tail2 ){
int cur = q[ head2++ ];
for( int i=head[ cur ];i!=-;i=edge[ i ].next ){
int nxt = edge[ i ].v;
if( edge[ i ].val> && lev[ nxt ]==- ){
lev[ nxt ] = lev[ cur ] + ;
q[ tail2++ ] = nxt;
}
}
}
if( lev[ dest ]==- ) return false;
else return true;
} int Dinic( int src,int dest,int n ){
int maxFlow = ;
while( true ){
if( bfs( src,dest,n )==false )
break;
//printf("ok\n");
int id = src;
int tail = ;
while( true ){
if( id==dest ){
int flow = inf;
int flag = -;
for( int i=;i<tail;i++ ){
if( edge[ q[ i ] ].val<flow ){
flow = edge[ q[ i ] ].val ;
flag = i;
}
}
for( int i=;i<tail;i++ ){
edge[ q[ i ] ].val -= flow;
edge[ q[ i ]^ ].val += flow;
}
if( flag==- ) {
// printf("Un_Normal\n");
return inf;
}
else{
maxFlow += flow;
tail = flag;
id = edge[ q[ flag ] ].u;
}
}
//solve maxFlow
id = head[ id ];
while( id!=- ){
if( edge[ id ].val> && lev[ edge[id].u ]+==lev[ edge[id].v ] ){
break;
}
id = edge[ id ].next;
}
if( id!=- ){
q[ tail++ ] = id;
id = edge[ id ].v;
}
else{
if( tail== ) break;
lev[ edge[ q[ tail- ] ].v ] = -;
id = edge[ q[ --tail ] ].u;
}
}
}
//printf("Normal:\n");
return maxFlow;
} int main(){
//freopen( "in.txt","r",stdin );
int n;
//printf("ok\n");
while( scanf("%d",&n)== ){
init();
int cc;
int u,v;
//printf("begin input\n");
for( int i=;i<n;i++ ){
scanf("%d",&cc);
//printf("cc = %d\n",cc);
u = i;
while( cc-- ){
scanf("%d",&v);
if( u==||v==n ){
addedge( u,v, );
addedge( v,u, );
}
else{
addedge( u,v,inf );
addedge( v,u, );
}
}
}
int src = ;
int dest = n;
//printf("begin\n");
printf("%d\n",Dinic( src,dest,n ));
}
return ;
}
ECNU1101-Dinic的更多相关文章
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)
最小割的好题,可用作模板. //Dinic+枚举字典序最小的最小割点集 //Time:1032Ms Memory:1492K #include<iostream> #include< ...
- 网络流dinic实现总结
太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现 int dfs(int now,int flow,int sum) { if(now==n) return flo ...
- ACM/ICPC 之 Dinic算法(POJ2112)
Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...
- hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)
#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...
- HDU 3572 Task Schedule(拆点+最大流dinic)
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- ISAP算法对 Dinic算法的改进
ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...
- hdu4292Food(最大流Dinic算法)
/* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!f-food, p-people, d-drink 建图: 0(源点 ...
- DINIC网络流+当前弧优化
DINIC网络流+当前弧优化 const inf=; type rec=record s,e,w,next:longint; end; var b,bb,d,q,tb:..] of longint; ...
- dinic模板
procedure addedge(u,v,cap:longint); begin sid[tot].u:=u; sid[tot].v:=v; sid[tot].cap:=cap; sid[tot]. ...
随机推荐
- 设置Oracle 12C OEM 端口
SQL); 打开OEM: http://DBSIPOrName:8087/em/
- css3学习笔记之用户界面
CSS3 调整尺寸(Resizing) CSS3中,resize属性指定一个元素是否应该由用户去调整大小. 这个 div 元素由用户调整大小. (在 Firefox 4+, Chrome, 和 Saf ...
- Java使用wkhtmltox实现HTML代码生成PDF文档或者图片
由于项目需要,把HTML代码转为PDF或者图片进行保存.最开始使用Flying Saucer来把HTML代码生成为PDF文档,功能已经开发出来了,也能够完成转换功能,期间也遇到了中文支持以及图片路径的 ...
- UvaLive7362 Fare(欧拉函数)
题意:求1~n的素因子之和. 分析:欧拉函数 #include<cstdio> #include<cstring> #include<cctype> #includ ...
- DTCMS展示一级栏目并展示各自栏目下的二级栏目
c#代码中 <!--C#代码--> <%csharp%> string parent_id=DTRequest.GetQueryString("parent_id&q ...
- [转]Excel生成批量SQL语句,处理大量数据的好办法
当有大量重复体力工作写入或修改数据到数据库中时,可以 第一,将Excel数据整理好了之后,通过SQL的导入功能直接导进数据库,但是得保证数据库字段和Excel的字段一致. 第二,通过Excel来生成对 ...
- WinForm多线程及委托防止界面假死
当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决. using System; using System.Collections.Generi ...
- python(三)一个文件读写操作的小程序
我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...
- Cassandra1.2文档学习(18)—— CQL数据模型(下)
三.集合列 CQL 3 引入了一下集合类型: •set •list •map 在关系型数据库中,允许用户拥有多个email地址,你可以创建一个email_addresses表与users表存在一个多对 ...
- nginx如何实现404状态返回 200隐藏URL
以http://WWW.cnblogs.COM为例: server { listen 80; server_nam ...