题意:从起点到终点有几条特殊路径。

特殊路径指的是:对于任意两条路径,他们的与起点相连的点是不同的点 && 与终点的相连的点是不同的点。

 /*
题意:从起点到终点有几条特殊路径。
特殊路径指的是:对于任意两条路径,他们的与起点相连的点是不同的点 && 与终点的相连的点是不同的点。
思路:
把起点和后继节点的流量设置为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的更多相关文章

  1. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  2. ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)

    最小割的好题,可用作模板. //Dinic+枚举字典序最小的最小割点集 //Time:1032Ms Memory:1492K #include<iostream> #include< ...

  3. 网络流dinic实现总结

    太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现 int dfs(int now,int flow,int sum) { if(now==n) return flo ...

  4. ACM/ICPC 之 Dinic算法(POJ2112)

    Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...

  5. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  6. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. ISAP算法对 Dinic算法的改进

    ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...

  8. hdu4292Food(最大流Dinic算法)

    /* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!f-food, p-people, d-drink 建图: 0(源点 ...

  9. DINIC网络流+当前弧优化

    DINIC网络流+当前弧优化 const inf=; type rec=record s,e,w,next:longint; end; var b,bb,d,q,tb:..] of longint; ...

  10. dinic模板

    procedure addedge(u,v,cap:longint); begin sid[tot].u:=u; sid[tot].v:=v; sid[tot].cap:=cap; sid[tot]. ...

随机推荐

  1. C#中实现抽象类里建立静态方法

    这篇文章主要介绍了C#中实现抽象类里建立静态方法,需要的朋友可以参考下   本文简述了C#中实现抽象类里建立静态方法的解决办法,示例程序如下: 1 2 3 4 5 6 public class Tes ...

  2. In-App-Purcharse 官方原文摘要笔记

    这并不是一篇关于 In-App-Purcharse 的专业深入分析文章,只是在初次浏览有关IAP官方文档后记录的一些需要注意的地方,就像是课堂笔记. 因为这是原版.并且涉及到支付的内容,所以就不翻译, ...

  3. ASP.NET WEB API 初探

    本文初步介绍如何简单创建一个ASP.NET Web Api 程序. Web Api 顾名思义就是一个Api接口,客户端可调用此接口进行业务操作.此类应用与 ASP.NET  web服务(即使用扩展名. ...

  4. 【转载】Linux小白福利:《超容易的Linux系统管理入门书》(三)在虚拟机上安装Linux

    本篇是Linux小白最佳实践第3篇,目的就是让白菜们自己动手安装个Linux玩玩.如果你是Linux小白,请务必亲自动手来安装.不想安装多个操作系统的,虚拟机是最佳选择,一台电脑上可以用虚拟机安装7. ...

  5. android xml的生成与解析

    Main java package com.itheima.xml; import android.app.Activity; import android.content.Context; impo ...

  6. GDB 进行调试 使用心得

    GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法:   直接用 gdb app -p1 -p2 这样进行调试是不行的.   需要像以下这样使用:    #gdb app   ...

  7. fltk_hello world

    int main(int argc, char *argv[]) { #define WINDOW_BG FL_BLACK #define WINDOW_WIDTH 640 #define WINDO ...

  8. delphi中的临界区

    var fLock:TRTLCriticalSection; //定义临界区域 // 初始化 InitializeCriticalSection(fLock); //进入临界区 EnterCritic ...

  9. pyunit实现数据测试框架

    PyUnit提供的动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setUp()方法中完成,而资源的释放则可以在tearDown()方法中完成. 使用PyUnit可以像 ...

  10. butterknife7.0.1使用

    1.官网:http://jakewharton.github.io/butterknife/ Introduction Annotate fields with @Bind and a view ID ...