题目描述

学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成
两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。对于带权图来说,将
所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在
关于s,t的割中容量最小的割。
而对冲刺NOI竞赛的选手而言,求带权图中两点的最小割已经不是什么难事了。我们可以把
视野放宽,考虑有N个点的无向连通图中所有点对的最小割的容量,共能得到N(N−1)
2个数值。
这些数值中互不相同的有多少个呢?这似乎是个有趣的问题。

输入

输入文件第一行包含两个数N,M,表示点数和边数。接下来M行,每行三个数u,v,w,
表示点u和点v(从1开始标号)之间有条边权值是w。
1<=N<=850 1<=M<=8500 1<=W<=100000

输出

输出文件第一行为一个整数,表示个数。

样例输入

4 4
1 2 3
1 3 6
2 4 5
3 4 4

样例输出

3
 
最小割树模板题,暴力枚举任意两个点在最小割树上求路径边权最小值,用$map$存一下权值即可。

#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[900];
int to[1800];
int val[1800];
int next[1800];
int dep[900];
int tot;
int f[900][12];
int g[900][12];
int n,m,k;
int u,v,w;
int id[900];
int now;
map<int,int>mp;
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=1;
int S,T;
int q[900];
int d[900];
int head[900];
int next[18000];
int val[18000];
int col[900];
int to[18000];
int vir[18000];
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<=10;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<=10;i++)
{
if(d&(1<<i))
{
res=min(res,g[x][i]);
x=f[x][i];
}
}
if(x==y)
{
return res;
}
for(int i=10;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()
{
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);
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(!mp[lca(i,j)])
{
mp[lca(i,j)]=1;
ans++;
}
}
}
printf("%d",ans);
}

BZOJ4519[Cqoi2016]不同的最小割——最小割树+map的更多相关文章

  1. [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树

    不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...

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

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

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

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

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

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

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

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

  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. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

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

  9. 【BZOJ4519】[Cqoi2016]不同的最小割 最小割树

    [BZOJ4519][Cqoi2016]不同的最小割 Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分 ...

  10. BZOJ4519 CQOI2016不同的最小割(最小割+分治)

    最小割树:新建一个图,包含原图的所有点,初始没有边.任取两点跑最小割,给两点连上权值为最小割的边,之后对于两个割集分别做同样的操作.最后会形成一棵树,树上两点间路径的最小值即为两点最小割.证明一点都不 ...

随机推荐

  1. 命令行创建mysql数据库指定编码方法

    GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE t ...

  2. 详解JSOUP的Select选择器语法

    本文参考:JSOUP中文文档 问题 你想使用类似于CSS或jQuery的语法来查找和操作元素. 方法 可以使用Element.select(String selector) 和 Elements.se ...

  3. @vue/cli 3 运行支持报错 socket

    问题 /sockjs-node/info 无限报错 解决方案 原因是相关代理端不支持 ws,因此需要在代理处关闭 ws,即 ws: false,如下: vue.config.js const ds_p ...

  4. 【C#复习总结】细说泛型委托

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  5. Python股票分析系列——基础股票数据操作(一).p3

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...

  6. 循环 while

    day 2 ---------------------------------------------------把一件简单的事情做到极致,你就成功了. Day2作业及默写 1.判断下列逻辑语句的Tr ...

  7. UITableView套UITableView数据刷新

    https://www.jianshu.com/p/ee4b2bd54d08 网上关于tableview嵌套tableview的文章很多,纵览很多后发现有两点没有满足需求 把两个tableview放在 ...

  8. IOS - UTF-8转码问题

    2016.07.06 21:45* 字数 61 阅读 921评论 0喜欢 2 IOS中提供的转码. [utf8str stringByAddingPercentEscapesUsingEncoding ...

  9. 认识Debian

    Debian -- 通用操作系统https://www.debian.org/ DebianStretch - Debian Wikihttps://wiki.debian.org/DebianStr ...

  10. [转帖]firewall-cmd

    firewall-cmd https://wangchujiang.com/linux-command/c/firewall-cmd.html 高手大作 等哪天需要防火墙了 再练习一下. Linux上 ...