【BZOJ-2521】最小生成树 最小割
2521: [Shoi2010]最小生成树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 415 Solved: 242
[Submit][Status][Discuss]
Description
.jpg)
当然啦,这些都不是今天需要你解决的问题。Secsa想知道对于某一条无向图中的边AB,至少需要多少代价可以保证AB边在这个无向图的最小生成树中。为了使得AB边一定在最小生成树中,你可以对这个无向图进行操作,一次单独的操作是指:先选择一条图中的边 P1P2,再把图中除了这条边以外的边,每一条的权值都减少1。如图 4所示就是一次这样的操作:
.jpg)
Input
Output
输出文件只有一行,这行只有一个整数,即,使得标号为Lab边一定出现最小生成树中的最少操作次数。
Sample Input
1 2 2
1 3 2
1 4 3
2 3 2
2 4 4
3 4 5
Sample Output
HINT
第1个样例就是问题描述中的例子。
1<=n<=500,1<=M<=800,1<=D<10^6
Source
Solution
水题
首先考虑,选择一条边不变,其余边权-1;显然就相当于,选择一条边权+1,其余边不变
要求选定边id一定在最小生成树上,考虑一下求最小生成树的过程Kruskal
显然对这条边有影响的边是初始边权比他小的边,若id边一定加入到最小生成树中,也就是说,边权<=val[id]的边中,不存在能使x[id],y[id]的联通的边
那么对于一条边x,使他不对id产生影响的最小代价是val[id]+1-val[x](使他边权变成恰大于id边权)
那么显然最小化代价,用最小割处理即可
把初始边权小于等于id的边相连,约束为val[id]+1-val[x],然后跑x[id]到y[id]的最小割即可
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
void Freopen () {freopen("build.in","r",stdin); freopen("build.out","w",stdout);}
void Fclose() {fclose(stdin); fclose(stdout);}
#define MAXM 1000010
#define MAXN 1010
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int N,M,id;
struct RoadNode{int u,v,w,id;}road[MAXM];
struct EdgeNode{int next,to,cap;}edge[MAXM<<];
int head[MAXN],cnt=;
void AddEdge(int u,int v,int w) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w;}
void InsertEdge(int u,int v,int w) {AddEdge(u,v,w); AddEdge(v,u,);}
int h[MAXN],cur[MAXN],S,T;
bool BFS()
{
queue<int>q;
for (int i=S; i<=T; i++) h[i]=-;
q.push(S); h[S]=;
while (!q.empty())
{
int now=q.front(); q.pop();
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].cap && h[edge[i].to]==-)
h[edge[i].to]=h[now]+,q.push(edge[i].to);
}
return h[T]!=-;
}
int DFS(int loc,int low)
{
if (loc==T) return low;
int used=,w;
for (int i=cur[loc]; i; i=edge[i].next)
if (edge[i].cap && h[edge[i].to]==h[loc]+)
{
w=DFS(edge[i].to,min(edge[i].cap,low-used));
edge[i].cap-=w,edge[i^].cap+=w; used+=w;
if (edge[i].cap) cur[loc]=i;
if (used==low) return low;
}
if (!used) h[loc]=-;
return used;
}
#define INF 0x7fffffff
int Dinic()
{
int re=;
while (BFS())
{
for (int i=S; i<=T; i++) cur[i]=head[i];
re+=DFS(S,INF);
}
return re;
}
int D;
void BuildGraph()
{
S=,T=N+;
for (int i=; i<=M; i++)
if (road[i].w<=D)
{
if (road[i].id!=id)
InsertEdge(road[i].u,road[i].v,D+-road[i].w),
InsertEdge(road[i].v,road[i].u,D+-road[i].w);
else InsertEdge(S,road[i].u,INF),InsertEdge(road[i].v,T,INF);
}
else break;
}
bool cmp(RoadNode A,RoadNode B) {return A.w<B.w;}
int main()
{
N=read(),M=read(),id=read();
for (int i=; i<=M; i++)
road[i].u=read(),road[i].v=read(),road[i].w=read(),road[i].id=i;
D=road[id].w;
sort(road+,road+M+,cmp);
BuildGraph();
printf("%d\n",Dinic());
return ;
}
【BZOJ-2521】最小生成树 最小割的更多相关文章
- BZOJ 2521 最小生成树(最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=2521 题意:每次能增加一条边的权值1,求最小代价让一条边保证在最小生成树里 思路:如果两个点中有环, ...
- BZOJ 2561: 最小生成树(最小割)
U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...
- BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...
- BZOJ2521:[SHOI2010]最小生成树(最小割)
Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...
- BZOJ2561最小生成树——最小割
题目描述 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最 ...
- BZOJ2521[Shoi2010]最小生成树——最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【BZOJ2521】[Shoi2010]最小生成树 最小割
[BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...
- 【BZOJ2561】最小生成树 最小割
[BZOJ2561]最小生成树 Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在 ...
- spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】
因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...
随机推荐
- centos安装docker
一.升级内核 [root@iZ2893wjzgyZ ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@iZ289 ...
- VMWare发布ESXi 6.0
发布声明 https://www.vmware.com/support/vsphere6/doc/vsphere-esxi-vcenter-server-60-release-notes.html 获 ...
- 产品经理技能之MRD的笔记之一
原文:http://www.woshipm.com/pmd/131946.html/comment-page-1 产品经理技能之MRD 一.MRD与BRD的不同之处 BRD:这么做有什么好处,并说明好 ...
- elk-redis
yum install redis -y vim /etc/redis [root@linux-node1 etc]# grep '^[a-z]' /etc/redis.conf daemonize ...
- JSP中的Servlet及Filter
asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类 ...
- 20145230GDB调试汇编堆栈过程分析
20145230GDB调试汇编堆栈过程分析 分析过程 出现的问题:一开始无法编译,是因为我们的Linux中没有安装一个库. 进入之前先设置断点,之后disassemble可以获取汇编代码,用i r指令 ...
- .net程序员转行做手游开发经历(五)
大家好,真的是好长时间都没有更新博客了.上来博客园发现很多朋友还在关注我们,那给大家汇报下最近的一些进展. 收费版上线了,但是下载量不是很多,刚发布的时候下载每天的下载还是挺多,我们几个小伙伴在论坛. ...
- redis性能测试tcp socket and unix domain
UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socke ...
- jquery图片轮播效果(unslider)
今天做网站(住建局网站)需要用到图片轮播,刚开始想借鉴DTCMS上的,查看CSS与页面代码,呵呵,不复杂,直接复制过来,结果调整半天,页面还是各种乱,没办法,网上找一个吧,于是找到了今天要说的这货un ...
- JS导出Excel 代码笔记
var tableToExcel = (function () { var uri = 'data:application/vnd.ms-excel;base64,', template = '< ...