题意:求最小割时候割边最少的数量。算法:先求dinic一遍,跑出残网络,再把该网络中满流量(残量为0)的边

残量改为1,其他边残量改为无穷,则再跑一次最大流,所得即为答案。(思,最小割有喝多组,但是要割边数量最少

的,那么把满流的流量改为1,再跑一次最大流即可)。

未1A原因:

1*:添加边的时候,把双向边添加为一条(反向的流量上限==正向),这样不是不可以,但是由于后面用到要取有效边

(非后悔边,边编号比为偶数),导致错误,改为添加俩次即可。

2//:数据较大,总流量10W*1000,可能暴int。

#include<iostream>  //98ms
#include<cstdio>
#include<queue>
using namespace std;
long long e[400001][3];int head[1100];const int inf=0x3f3f3f3f;
int n,m;int nume;
void addedge(int from,int to,int w,int derect) //添加边的函数,derect为1时要添加双向边
{
e[nume][0]=to; e[nume][1]=head[from];head[from]=nume;
e[nume++][2]=w;
e[nume][0]=from; e[nume][1]=head[to];head[to]=nume;
e[nume++][2]=0;
if(derect==1)
{
e[nume][0]=from; e[nume][1]=head[to];head[to]=nume;
e[nume++][2]=w;
e[nume][0]=to; e[nume][1]=head[from];head[from]=nume;
e[nume++][2]=0;
}
}
int level[1100];int vis[1100];
bool bfs() //dinic
{
for(int i=0;i<=n;i++)
vis[i]=level[i]=0;
queue<int>q;q.push(0);
vis[0]=1;
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{ int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
level[v]=level[cur]+1;
if(v==n-1)return 1;
vis[v]=1;
q.push(v);
}
}
}
return vis[n-1];
}
long long dfs(int u,long long minf)
{
if(u==n-1||minf==0)return minf;
long long sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{ int v=e[i][0];
if(level[v]==level[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
minf-=f;sumf+=f;
}
}
return sumf;
}
long long dinic()
{
long long sum=0;
while(bfs())
{
sum+=dfs(0,inf);
}
return sum;
}
long long getmincut()
{
long long cutedge=0;
for(int i=0;i<=n;i++)
vis[i]=0;
queue<int>q;q.push(0);vis[0]=1;
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{ int v=e[i][0];
if(i%2==0&&e[i][2]==0) //边数偶数的边是残量网络有效边(非后悔边)
{ e[i][2]=1;e[i^1][2]=0;}
else if(i%2==0&&e[i][2]>0)
{e[i][2]=inf;e[i^1][2]=0;}
if(!vis[v]&&e[i][2]>=0)
{
vis[v]=1;q.push(v);
}
}
}
cutedge=dinic();
return cutedge;
}
int main()
{
int N;scanf("%d",&N); int casenum=1;
while(N--)
{
scanf("%d%d",&n,&m);
nume=0;
for(int i=0;i<=n;i++)
head[i]=-1;
for(int i=0;i<m;i++)
{ int from,to,w,d;
scanf("%d%d%d%d",&from,&to,&w,&d);
addedge(from,to,w,d);
}
dinic();
long long ans=getmincut();
printf("Case %d: %lld\n",casenum,ans);
casenum++;
}
return 0;
}

hdu3987,最小割时求最少割边数的更多相关文章

  1. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  2. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  3. 网络流+最小生成树的最少割边数--How Many to Be Happy?

    题意:https://blog.csdn.net/Ratina/article/details/95200594 思路: 首先我们知道最小生成树就是按长度枚举边,能连就连. 那么,如果这条边在最小生成 ...

  4. HDU 3987 Harry Potter and the Forbidden Forest(边权放大法+最小割)

    Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/ ...

  5. hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割

    view code//hdu 3987 #include <iostream> #include <cstdio> #include <algorithm> #in ...

  6. HDU 6214.Smallest Minimum Cut 最少边数最小割

    Smallest Minimum Cut Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Oth ...

  7. TZOJ 5110 Pollutant Control(边数最少最小割最小字典序输出)

    描述 It's your first day in Quality Control at Merry Milk Makers, and already there's been a catastrop ...

  8. hdu 6214 Smallest Minimum Cut(最小割的最少边数)

    题目大意是给一张网络,网络可能存在不同边集的最小割,求出拥有最少边集的最小割,最少的边是多少条? 思路:题目很好理解,就是找一个边集最少的最小割,一个方法是在建图的时候把边的容量处理成C *(E+1 ...

  9. HDU 3657 Game(取数 最小割)经典

    Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

随机推荐

  1. 阿里Java架构师面试高频300题:集合+JVM+Redis+并发+算法+框架等

    前言 在过2个月即将进入9月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的java开发朋友跳槽面试,无论一面还是二面,都开始考验一个Java程序员的技术功底和 ...

  2. linux——nmap端口扫描命令

    先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...

  3. Mac 下 Android Studio 安装

    给大家介绍下 Mac Os 系统下的 Android Studio 的安装吧,二者步骤类似. 方法/步骤   1 首先下载 Mac 环境下的 Android Studio 的安装包,为 dmg 格式的 ...

  4. EditorConfig文件

    EditorConfig .editorconfig文件 在很多开源项目中,会出现这个文件,这个文件有何作用? editorconfig 帮助开发者的(编辑器和IDEs)定义和维护编程风格. 有些编辑 ...

  5. ExtJs如何使用自定义插件动态保存表头配置(隐藏或显示)

    关于保存列表表头的配置,一般我们不需要与后台交互,直接保存在 localStorage 中就能满足常规使用需求(需要浏览器支持). 直接上代码,插件: Ext.define('ux.plugin.Co ...

  6. Centos忘记密码解决方法

    centos6.8忘记root密码解决方法 重启系统后出现GRUB界面在引导装载程序菜单上,用上下方向键选择你忘记密码的那个系统键入"e" 来进入编辑模式. 接下来你可以看到如下图 ...

  7. python--操作系统介绍,进程的创建(并发)

    一 .  操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 所谓多道程序设计技术,就是指允许多个程序同时进入内存 ...

  8. Python之路-基础数据类型之字典 集合

    字典的定义-dict 字典(dict)是python中唯⼀的⼀个映射类型.他是以{ }括起来的键值对组成,字典是无序的,key是不可修改的.dic = {1:'好',2:'美',3:'啊'} 字典的操 ...

  9. JavaScript正则表达式-字符

    普通字符 大小写字母.数字.其他任何符号. 转义字符 转义字符 含义 \f 换页符 \n 换行符 \r 回车符 \t 制表符 \b 退格符 \o 空字符 \xnn 由十六进制数nn指定的ASCII码对 ...

  10. redis配置cluster分布式集群

    #下载最新的redis5. wget http://download.redis.io/releases/redis-5.0.3.tar.gz .tar.gz cd redis- make make ...