#[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]最小生成树的更多相关文章

  1. BZOJ2521:[SHOI2010]最小生成树(最小割)

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  2. BZOJ2521[Shoi2010]最小生成树——最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  3. 【BZOJ2521】[Shoi2010]最小生成树 最小割

    [BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...

  4. 【BZOJ-2521】最小生成树 最小割

    2521: [Shoi2010]最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 415  Solved: 242[Submit][Statu ...

  5. BZOJ 2521: [Shoi2010]最小生成树

    2521: [Shoi2010]最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 445  Solved: 262[Submit][Statu ...

  6. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  7. 【BZOJ2521】 [Shoi2010]最小生成树

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  8. BZOJ 2521: [Shoi2010]最小生成树(最小割)

    题意 对于某一条无向图中的指定边 \((a, b)\) , 求出至少需要多少次操作.可以保证 \((a, b)\) 边在这个无向图的最小生成树中. 一次操作指: 先选择一条图中的边 \((u, v)\ ...

  9. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...

随机推荐

  1. shell脚本实现ftp上传下载文件

    前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...

  2. Codeforces 735E 树形DP

    题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...

  3. 【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

    Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranki ...

  4. java 静态内存图、静态代码块

    package java08; /* 静态代码块格式: public class 类名称{ static{ //静态代码块 } } 特点:当第一次执行本类时,静态代码块执行唯一的一次 * */ pub ...

  5. maven多模块

    https://www.cnblogs.com/lichking2017/p/8996939.html

  6. mysql 联合表查询从表即使有索引依然ALL的一个原因

    那就是主表和从表的关联字段的编码方式不一样!!! 晕啊,折腾了半天才发现,可能是不知道啥时候mysql更改主体编码方式了,结果导致后来新建的表的关联字段和之前的主表的字段的编码方式不一样 改成一样的编 ...

  7. python之chardet用来检测字符串编码的

    import chardet a=b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xe3\x80\x82'print(ch ...

  8. Web项目改名的带来的404not found问题

    为了保留上一次编辑的billsys web项目,把项目复制一份到同一个工作空间后,对原来项目名进行了重命名,如右图: 结果再去访问,一直报404错误 解决思路如下: 其实仔细观察,会在项目部署界面发现 ...

  9. python3下tomorow模块报语法错误def async(n, base_type, timeout=None): ^ SyntaxError: invalid syntax

    python3 pip 安装tomorrow模块,调用时候会报错:def async(n, base_type, timeout=None): ^ SyntaxError: invalid synta ...

  10. Python实现BFS,DFS

    BFS:队 graph = { "A" : ["B","C"], "B" : ["A"," ...