题解 [SHOI2010]最小生成树
题面
解析
看上去是黑题啊!
实际上也就是道网络流最大流。
当然,我们也知道网络流最关键的是建图。
首先,分析一下题目:
题目要求在操作后使给定的边lab一定在最小生成树上,
求最小的操作数。
先设lab连通的边为A,B。
那么,根据Krustal算法,在加入lab时一定没有权值比lab小的边使A,B连通。
所以,只要将权值比lab小的边重新建图,
将容量设为这条边最少的操作次数就行了。
而最小的操作次数就应该是wlab −wi +1。
最后求A到B的最小割(最大流)就行了。
上AC代码:
#include<bits/stdc++.h>
using namespace std; inline int read(){
int sum=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){sum=sum*+ch-'';ch=getchar();}
return f*sum;
} const int INF=0x3f3f3f3f;
struct road{
int next,to,w;
}e[];
struct line{
int x,y,w;
}a[];
int n,m,lab;
int s,t;
int head[],cnt=;
int d[],v[]; void add(int x,int y,int w){
e[++cnt].to=head[x];
e[cnt].next=y;
e[cnt].w=w;
head[x]=cnt;
} bool bfs(){
memset(d,-,sizeof(d));
memset(v,,sizeof(v));
queue <int> que;
que.push(s);
v[s]=;
d[s]=;
while(!que.empty()){
int x=que.front();
que.pop();
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(v[k]||!e[i].w) continue;
v[k]=;
d[k]=d[x]+;
que.push(k);
}
}
if(d[t]>) return ;
return ;
} int dfs(int x,int low){
if(x==t) return low;
int c=;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(d[k]!=d[x]+) continue;
if(!e[i].w) continue;
if((c=dfs(k,min(low,e[i].w)))){
e[i].w-=c;
e[i^].w+=c;
return c;
}
}
return ;
} void DINIC(){
int ans=,mi;
while(bfs()){
while((mi=dfs(s,INF))) ans+=mi;
}
printf("%d\n",ans);
return ;
} int main(){
// freopen("mst.in","r",stdin);
// freopen("mst.out","w",stdout);
n=read();m=read();lab=read();
for(int i=;i<=m;i++){
a[i].x=read();a[i].y=read();a[i].w=read();
}
s=a[lab].x;t=a[lab].y;
for(int i=;i<=m;i++){
if(a[i].w<=a[lab].w&&i!=lab){
add(a[i].x,a[i].y,a[lab].w-a[i].w+);
add(a[i].y,a[i].x,);
add(a[i].y,a[i].x,a[lab].w-a[i].w+);
add(a[i].x,a[i].y,);
}
}
DINIC();
return ;
}
题解 [SHOI2010]最小生成树的更多相关文章
- 【BZOJ2521】[Shoi2010]最小生成树 最小割
[BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...
- BZOJ 2521: [Shoi2010]最小生成树
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 445 Solved: 262[Submit][Statu ...
- bzoj2521 [Shoi2010]最小生成树
[Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MB Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出 ...
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 题解 [51nod1771] 最小生成树中的边
题面 解析 这题好像没人写过啊(所以好像没题解)... 然后刚了一天才写出来摆了半天. 其实一开始是想错了, 写了个\(O(n^2)\)的近似于暴力的方法. 就是对于每组权值相等的边, 对于每条边先把 ...
- BZOJ2521:[SHOI2010]最小生成树(最小割)
Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...
- BZOJ2521[Shoi2010]最小生成树——最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- BZOJ 2521: [Shoi2010]最小生成树(最小割)
题意 对于某一条无向图中的指定边 \((a, b)\) , 求出至少需要多少次操作.可以保证 \((a, b)\) 边在这个无向图的最小生成树中. 一次操作指: 先选择一条图中的边 \((u, v)\ ...
- 【BZOJ2521】 [Shoi2010]最小生成树
Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...
随机推荐
- LG P2822 NOIP2016D2T1 组合数问题
一句话题意 给定n.m和k,求对于所有的i(0<=i<=n)和j(0<=j<=min(i,m)),有多少对(i,j)使\(C_i^j\)使k的倍数 数据范围 部分分.满分做法和 ...
- Java开源网页抓取工具httpClient以及jsoup
网上看到不错的Java网页抓取工具和库 先记录一下 使用java开源工具httpClient及jsoup抓取解析网页数据
- X86逆向11:F12暂停法的妙用
本节课将介绍F12暂停法的使用技巧,F12暂停法的原理其实很简单,当我们点击OD中的暂停按钮时,OD会将当前的堆栈状态保存起来,并暂停当前窗体的线程执行,直到我们点击运行按钮OD才会唤醒全部线程并继续 ...
- 怎样使用 v-for ?
v-bind / v-on / v-if / v-for , 这四个指令应该是 vue 里面最常用的了, 之前已经简单记录的前三个的使用方法, 接下来就记一下 v-for 的基本用法. 1. v-fo ...
- python读写增删修改ini配置文件
一,百度百科 .ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的 ...
- Java lesson18homework
package com.xt.lesson19; import java.util.Scanner;import java.util.Set;import java.util.TreeSet; /** ...
- sp_addlinkedserver 跨服务器连接数据库查询
----创建远程链接服务器--exec sys.sp_addlinkedserver --@server='LMS',--被访问的服务器别名--@srvproduct='',--@provider=' ...
- lunix部署其前端项目常见报错
1.npm install 报权限错误,如: 解决办法: 添加--unsafe-perm 参数,如 #npm install --registry=https://registry.npm.taoba ...
- 无障碍开发(六)之ARIA在HTML中的使用规则
ARIA使用规则一 如果你使用的元素( HTML5 )具有语义化,应该使用这些元素,而不应该重新定义一个添加ARIA的角色.状态或属性的元素. 浏览器的语义化标签已经默认隐含ARIA语义,像nav,a ...
- 短信对接——一种jdbc链接运用
package sms; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamRead ...