题目描述

小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。 对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割” 现给定一张无向图,小白有若干个形如“图中有多少对点它们的最小割的容量不超过x呢”的疑问,小蓝虽然很想回答这些问题,但小蓝最近忙着挖木块,于是作为仍然是小蓝的好友,你又有任务了。

输入

输入文件第一行有且只有一个正整数T,表示测试数据的组数。 对于每组测试数据, 第一行包含两个整数n,m,表示图的点数和边数。 下面m行,每行3个正整数u,v,c(1<=u,v<=n,0<=c<=106),表示有一条权为c的无向边(u,v) 接下来一行,包含一个整数q,表示询问的个数 下面q行,每行一个整数x,其含义同题目描述。

输出

对于每组测试数据,输出应包括q行,第i行表示第i个问题的答案。对于点对(p,q)和(q,p),只统计一次(见样例)。

两组测试数据之间用空行隔开。

样例输入

1
5 0
1
0

样例输出

10

【数据范围】
对于100%的数据 T<=10,n<=150,m<=3000,q<=30,x在32位有符号整数类型范围内。
图中两个点之间可能有多条边

 
最小割树模板题,对于每次询问暴力枚举任意两个点在最小割树上求路径上边权最小值并判断是否$\le x$即可。求路径边权最小值用一个倍增数组即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define pr pair<int,int>
using namespace std;
int head[200];
int to[400];
int val[400];
int next[400];
int dep[200];
int tot;
int f[200][10];
int g[200][10];
int n,m,k;
int u,v,w;
int id[200];
int now;
void add_edge(int u,int v,int w)
{
next[++tot]=head[u];
head[u]=tot;
to[tot]=v;
val[tot]=w;
}
namespace DINIC
{
int tot;
int S,T;
int q[200];
int d[200];
int head[200];
int next[6010];
int val[6010];
int col[200];
int to[6010];
int vir[6010];
void init()
{
tot=1;
memset(head,0,sizeof(head));
memset(val,0,sizeof(val));
memset(col,0,sizeof(col));
memset(vir,0,sizeof(vir));
}
void add(int u,int v,int w)
{
next[++tot]=head[u];
head[u]=tot;
to[tot]=v;
val[tot]=w;
vir[tot]=w;
}
bool bfs(int S,int T)
{
int l=0,r=0;
memset(d,-1,sizeof(d));
q[r++]=S;
d[S]=0;
while(l<r)
{
int now=q[l];
l++;
for(int i=head[now];i;i=next[i])
{
if(d[to[i]]==-1&&val[i])
{
d[to[i]]=d[now]+1;
q[r++]=to[i];
}
}
}
if(d[T]==-1)
{
return false;
}
else
{
return true;
}
}
int dfs(int x,int maxflow)
{
if(x==T)
{
return maxflow;
}
int nowflow;
int used=0;
for(int i=head[x];i;i=next[i])
{
if(d[to[i]]==d[x]+1&&val[i])
{
nowflow=dfs(to[i],min(maxflow-used,val[i]));
val[i]-=nowflow;
val[i^1]+=nowflow;
used+=nowflow;
if(nowflow==maxflow)
{
return maxflow;
}
}
}
if(used==0)
{
d[x]=-1;
}
return used;
}
int dinic()
{
for(int i=2;i<=tot;i++)
{
val[i]=vir[i];
}
int res=0;
while(bfs(S,T)==true)
{
res+=dfs(S,0x3f3f3f3f);
}
return res;
}
void find(int x)
{
col[x]=now;
for(int i=head[x];i;i=next[i])
{
if(col[to[i]]!=now&&val[i])
{
find(to[i]);
}
}
}
void build(int l,int r)
{
if(l>=r)
{
return ;
}
S=id[l],T=id[l+1];
int cut=dinic();
now++;
find(S);
int L=l,R=r;
for(int i=l;i<=r;i++)
{
if(col[id[i]]==now)
{
q[L++]=id[i];
}
else
{
q[R--]=id[i];
}
}
for(int i=l;i<=r;i++)
{
id[i]=q[i];
}
add_edge(S,T,cut);
add_edge(T,S,cut);
build(l,L-1);
build(R+1,r);
}
};
void dfs(int x)
{
for(int i=1;i<=8;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
g[x][i]=min(g[x][i-1],g[f[x][i-1]][i-1]);
}
for(int i=head[x];i;i=next[i])
{
if(to[i]!=f[x][0])
{
dep[to[i]]=dep[x]+1;
f[to[i]][0]=x;
g[to[i]][0]=val[i];
dfs(to[i]);
}
}
}
int lca(int x,int y)
{
int res=1<<30;
if(dep[x]<dep[y])
{
swap(x,y);
}
int d=dep[x]-dep[y];
for(int i=0;i<=8;i++)
{
if(d&(1<<i))
{
res=min(res,g[x][i]);
x=f[x][i];
}
}
if(x==y)
{
return res;
}
for(int i=8;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
res=min(res,g[x][i]);
res=min(res,g[y][i]);
x=f[x][i];
y=f[y][i];
}
}
res=min(min(g[x][0],g[y][0]),res);
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(head,0,sizeof(head));
memset(dep,0,sizeof(dep));
memset(val,0,sizeof(val));
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
now=0;
tot=0;
DINIC::init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
DINIC::add(u,v,w);
DINIC::add(v,u,w);
}
for(int i=1;i<=n;i++)
{
id[i]=i;
}
DINIC::build(1,n);
dfs(1);
scanf("%d",&k);
while(k--)
{
scanf("%d",&u);
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(lca(i,j)<=u)
{
ans++;
}
}
}
printf("%d\n",ans);
}
printf("\n");
}
}

BZOJ2229[Zjoi2011]最小割——最小割树的更多相关文章

  1. [bzoj2229][Zjoi2011]最小割_网络流_最小割树

    最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...

  2. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)

    2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...

  3. scu - 3254 - Rain and Fgj(最小点权割)

    题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...

  4. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  5. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  6. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  7. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  8. 【BZOJ2229】[Zjoi2011]最小割 最小割树

    [BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...

  9. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

    思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...

随机推荐

  1. Elasticsearch 思维导图集锦(持续更新...)

    目录 引言 思维导图 全文搜索 Elastic 基础 Query DSL Multi Match Query 系列文章列表 参考 引言 本文主要是对 elasticsearch 的一些知识点使用思维导 ...

  2. Java执行JavaScript脚本破解encodeInp()加密

    一:背景 在模拟登录某网站时遇到了用户名和密码被JS进行加密提交的问题,如图: 二:解决方法 1.我们首先需要获得该JS加密函数,一般如下: conwork.js var keyStr = " ...

  3. 【C#复习总结】dynamic

    介绍 C# 4 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像具有类型 object 一样. 在编译时,将假定 ...

  4. Docker镜像的修改和自定义

    一.docker镜像的更新 (1)启动镜像,写入一些文件或者更新软件 docker run -it 3afd47092a0e[root@44652ba46352 /]# ls (2)更新镜像 dock ...

  5. Vladik and Complicated Book CodeForces - 811B (思维实现)

    Vladik had started reading a complicated book about algorithms containing n pages. To improve unders ...

  6. 【转】Restful是什么

    REST的概念是什么 维基百科  表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文 ...

  7. SOAP UI-----测webservice接口

    webservice的请求报文和返回报文都是xml格式的. 使用soapui.storm对webservice接口进行测试,postman无法测. http://www.webxml.com.cn/W ...

  8. semantic-ui 容器与栅格

    semantic中可以指定one-sixteen这16个单词来指定网格column所占的长度.也就是说,在网页中,一行最多只有16个column,超过16个之后,自动移到下一行. 栅格可以使用i,di ...

  9. mac下的快捷键

    功能 快捷键 通用 打开新窗口 command + n 打开新标签 command + t 关闭标签 command + w 缩小 command - 放大 command + 全屏.取消全屏 com ...

  10. ~/.bashrc与/etc/profile的区别

    ~/.bashrc:该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取. /etc/profile中设定的变量(全局)的可以作用于任 ...