bzoj2521 [Shoi2010]最小生成树
#[Shoi2010]最小生成树
####Time Limit: 10 Sec Memory Limit: 128 MB
###Description
Secsa最近对最小生成树问题特别感兴趣。他已经知道如果要去求出一个n个点、m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法。另外,他还知道,某一个图可能有多种不同的最小生成树。例如,下面图 3中所示的都是图 2中的无向图的最小生成树:
当然啦,这些都不是今天需要你解决的问题。Secsa想知道对于某一条无向图中的边AB,至少需要多少代价可以保证AB边在这个无向图的最小生成树中。为了使得AB边一定在最小生成树中,你可以对这个无向图进行操作,一次单独的操作是指:先选择一条图中的边 P1P2,再把图中除了这条边以外的边,每一条的权值都减少1。如图 4所示就是一次这样的操作:

###Input
输入文件的第一行有3个正整数n、m、Lab分别表示无向图中的点数、边数、必须要在最小生成树中出现的AB边的标号。
接下来m行依次描述标号为1,2,3…m的无向边,每行描述一条边。每个描述包含3个整数x、y、d,表示这条边连接着标号为x、y的点,且这条边的权值为d。
输入文件保证1<=x,y<=N,x不等于y,且输入数据保证这个无向图一定是一个连通图。
###Output
输出文件只有一行,这行只有一个整数,即,使得标号为Lab边一定出现最小生成树中的最少操作次数。
###Sample Input
4 6 1
1 2 2
1 3 2
1 4 3
2 3 2
2 4 4
3 4 5
###Sample Output
1
###HINT
第1个样例就是问题描述中的例子。
1<=n<=500,1<=M<=800,1<=D<10^6
首先kruskal瞎贪心过一会你就凉了。。。
例子:
1 2 2
2 1 2
1 3 1
2 3 6
强行6的边
所以你需要网络流。。。
因为你的目标是kruskal在你之前不连通,所以模拟这个过程,每条边权小于 (k+1)的边都建一条 (k+1-val) 的无向边。。。
然后网络流
#include<bits/stdc++.h>
using namespace std;
struct lpl{
int to, dis;
}lin;
const int maxn = 505, maxm = 805, INF = 0x7fffffff;
int cnt = -1, n, m, s, t, f, opt, A[maxm], B[maxm], val[maxm];
int layer[maxn];
vector<int> point[maxn];
vector<lpl> edge;
queue<int> q;
inline void connect(int a, int b, int c)
{
cnt++; lin.to = b; lin.dis = c; point[a].push_back(cnt); edge.push_back(lin);
cnt++; lin.to = a; lin.dis = c; point[b].push_back(cnt); edge.push_back(lin);
}
inline void putit()
{
scanf("%d%d%d", &n, &m, &opt);
for(int i = 1; i <= m; ++i) scanf("%d%d%d", &A[i], &B[i], &val[i]);
s = A[opt], t = B[opt], f = val[opt]; f++;
for(int i = 1; i <= m; ++i){
if(val[i] >= f) continue;
if(i == opt) continue;
connect(A[i], B[i], f - val[i]);
}
}
inline bool bfs()
{
int now, qwe; memset(layer, 0, sizeof(layer));
q.push(s); layer[s] = 1;
while(!q.empty()){
now = q.front(); q.pop();
for(int i = point[now].size() - 1; i >= 0; --i){
qwe = edge[point[now][i]].to;
if(layer[qwe] || edge[point[now][i]].dis <= 0) continue;
layer[qwe] = layer[now] + 1; q.push(qwe);
}
}
return layer[t];
}
int dfs(int a, int w)
{
if(w == 0 || a == t) return w;
int ret = 0;
for(int i = point[a].size() - 1; i >= 0; --i){
int now = point[a][i];
if(edge[now].dis <= 0 || layer[edge[now].to] != layer[a] + 1) continue;
int tmp = dfs(edge[now].to, min(edge[now].dis, w));
ret += tmp; edge[now].dis -= tmp; edge[now ^ 1].dis += tmp; w -= tmp;
if(!w) break;
}
return ret;
}
inline int Dinic()
{
int ret = 0;
while(bfs()) ret += dfs(s, INF);
return ret;
}
int main()
{
putit();
cout << Dinic();
return 0;
}
bzoj2521 [Shoi2010]最小生成树的更多相关文章
- BZOJ2521:[SHOI2010]最小生成树(最小割)
Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...
- BZOJ2521[Shoi2010]最小生成树——最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【BZOJ2521】[Shoi2010]最小生成树 最小割
[BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...
- 【BZOJ-2521】最小生成树 最小割
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 415 Solved: 242[Submit][Statu ...
- BZOJ 2521: [Shoi2010]最小生成树
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 445 Solved: 262[Submit][Statu ...
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【BZOJ2521】 [Shoi2010]最小生成树
Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...
- BZOJ 2521: [Shoi2010]最小生成树(最小割)
题意 对于某一条无向图中的指定边 \((a, b)\) , 求出至少需要多少次操作.可以保证 \((a, b)\) 边在这个无向图的最小生成树中. 一次操作指: 先选择一条图中的边 \((u, v)\ ...
- BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...
随机推荐
- elasticsearch 深入 —— 地理位置
地理位置 我们拿着纸质地图漫步城市的日子一去不返了.得益于智能手机,我们现在总是可以知道 自己所处的准确位置,也预料到网站会使用这些信息.我想知道从当前位置步行 5 分钟内可到的那些餐馆,对伦敦更大范 ...
- linux驱动启动顺序
首先,我们可以查看Linux内核编译完成后的System.map文件,在这个文件中我们可以看到macb(dm9161驱动模块)链接到了dm9000驱动之前,如下所示: c03b6d40 t __ini ...
- Ubunton
Ubunton 装完机后 root账户进不去 没密码 在自己账号下 sudo passwd 输入两次密码就是root的密码 之后就可以su root 密码进入了 外部客户端sftp方式连接: sudo ...
- 【串线篇】Mybatis之动态sql
一.if标签 <select id="getTeacherByCondition" resultMap="teacherMap"> select * ...
- 前端框架和其他:1.谈谈你对http协议的认识。
1.http是一种网络数据传输协议 hype text transfer protocol-超文本传输协议 2.传输什么:超文本(html文档) 3.协议遵守方,浏览器和服务器 4.一般的传输流程是 ...
- C#基础提升系列——C#集合
C#集合 有两种主要的集合类型:泛型集合和非泛型集合. 泛型集合被添加在 .NET Framework 2.0 中,并提供编译时类型安全的集合. 因此,泛型集合通常能提供更好的性能. 构造泛型集合时, ...
- Halo(七)
@ControllerAdvice 对Controller进行"切面"环绕 结合方法型注解 @ExceptionHandler 用于捕获Controller中抛出的指定类型的异常, ...
- C++ 分治思想 真假银币
#include "stdio.h" #include "iostream" #define MAXNUM 30 int FalseCoin(int coin[ ...
- appium介绍和工作原理
导读 Appium这个听起来既生疏也熟悉的自动化测试工具,比起原生的UiAutomator可能是异常的不起眼,可是却是有自身独当一面的能力,可以完成许多高难度作业,完成UiAutomator不可能完成 ...
- .NET Core 构建跨平台的桌面应用
1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...