「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树
题目描述
Farmer John 要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。 运输的总距离越小,运输的成本也就越低。低成本的运输是 Farmer John 所希望的。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。
输入格式
第一行是两个整数 N,MN,MN,M,表示顶点数和边数;
接下来 MMM 行每行 333 个整数,x,y,zx,y,zx,y,z,表示一条路的两端 x,yx,yx,y 和距离 zzz。
输出格式
仅一行,输出第二小方案。
样例
样例输入
4 4
1 2 100
2 4 200
2 3 250
3 4 100
样例输出
450
数据范围与提示
对于全部数据,1≤N≤500,1≤M≤104,1≤z≤1091\le N\le 500,1\le M\le 10^4,1\le z\le 10^91≤N≤500,1≤M≤104,1≤z≤109,数据可能有重边。
题解
这是一道裸的次小生成树。
次小生成树的两种食用方法:
- 就叫它法一吧。
- 首先求个最小生成树。
- 然后每次删掉一条树边,求树边两端两点的最短路。
- 时间复杂度$O(nmlogm)$
- 就叫它法二吧。
- 也是首先求个最小生成树。
- 之后求树上每两点的路径间最大的边权,需要$O(n^2)$。(枚举每个点做根,然后$O(n)$遍历
- 然后枚举每个非树边,设端点为$i,j$。
- 那么如果把这条边接上生成树,那么就把它所在的环上边权最大的那条边断掉,就是接上这条边的最优解。
- 所以枚举每条边,维护$最小生成树的权值和-MAX[i][j]+a[i][j]$的最小值。
- 复杂度$O(n^2+m)$
然后这里写的是法二。
编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
# #. 「一本通 3.1 练习 」秘密的牛奶运输 Accepted ms KiB C++ / 1.3 K qwerta -- ::
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
struct emm{
int l,r,v,tag;
}a[];
bool cmp(emm qaq,emm qwq){
return qaq.v<qwq.v;
}
int fa[];
int fifa(int x)
{
if(fa[x]==x)return x;
return fa[x]=fifa(fa[x]);
}
struct ahh{
int e,f,v;
}b[];
int h[];
int cnt=;
void con(int x,int y,int len)//加边
{
b[++cnt].f=h[x];
h[x]=cnt;
b[cnt].e=y;
b[cnt].v=len;
b[++cnt].f=h[y];
h[y]=cnt;
b[cnt].e=x;
b[cnt].v=len;
return;
}
int MAX[][];//两点树上路径中边权最大值
int s;
void dfs(int x)//dfs找MAX[s][x]
{
for(int i=h[x];i;i=b[i].f)
if(!MAX[s][b[i].e]&&b[i].e!=s)
{
MAX[s][b[i].e]=max(MAX[s][x],b[i].v);
dfs(b[i].e);
}
return;
}
int main()
{
//freopen("a.in","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[i]=(emm){x,y,z};//建原图
}
//跑最小生成树
for(int i=;i<=n;++i)
fa[i]=i;
sort(a+,a+m+,cmp);
int k=n-,i=;
long long now=;//记录最小生成树的边权和
while(k)
{
++i;
int u=fifa(a[i].l),v=fifa(a[i].r);
if(u!=v)
{
fa[u]=v;
con(a[i].l,a[i].r,a[i].v);//建树图
k--;
now+=a[i].v;
a[i].tag=;//标记为树边
}
}
for(s=;s<=n;++s)
{
dfs(s);
}
long long ans=1e15;
for(int i=;i<=m;++i)
if(!a[i].tag&&a[i].v>MAX[a[i].l][a[i].r])//如果该边为非树边并且它的权值大于左右端点的树上距离(因为是次小生成树,所以权值要比最小生成树大
{
ans=min(ans,now-MAX[a[i].l][a[i].r]+a[i].v);//把路径上最大的换成这条边的答案
}
cout<<ans;
return ;
}
题目描述
Farmer John 要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。 运输的总距离越小,运输的成本也就越低。低成本的运输是 Farmer John 所希望的。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。
输入格式
第一行是两个整数 N,MN,MN,M,表示顶点数和边数;
接下来 MMM 行每行 333 个整数,x,y,zx,y,zx,y,z,表示一条路的两端 x,yx,yx,y 和距离 zzz。
输出格式
仅一行,输出第二小方案。
样例
样例输入
4 4
1 2 100
2 4 200
2 3 250
3 4 100
样例输出
450
数据范围与提示
对于全部数据,1≤N≤500,1≤M≤104,1≤z≤1091\le N\le 500,1\le M\le 10^4,1\le z\le 10^91≤N≤500,1≤M≤104,1≤z≤109,数据可能有重边。
「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- LOJ#10117. 「一本通 4.1 练习 2」简单题
LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
#10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map
题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...
- 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP
题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...
- 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集
题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
随机推荐
- HDU BestCoder Round #1 1002 项目管理
项目管理 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- VESA-ADV7123-SOCKIT-DE2115
/*--VGA Timing--Horizontal :-- ______________ _____________-- | | |--_______________| VIDEO |_______ ...
- linux启动参数了解
文章来源:http://blog.csdn.net/uyiwfn/article/details/7172339在Linux中,给kernel传递参数以控制其行为总共有三种方法:1.build ker ...
- golang手动管理内存
作者:John Graham-Cumming. 原文点击此处.翻译:Lubia Yang(已失效) 前些天我介绍了我们对Lua的使用,implement our new Web Applicati ...
- 11 redis之rdb快照持久化
一:Redis持久化配置 Redis的持久化有2种方式[快照,是日志] 二:Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 // 如果3 ...
- 07 redi sorder set结构及命令详解
zadd key score1 value1 score2 value2 .. 添加元素 redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lil ...
- 【PHP开发】远程文件(图片)下载
这一篇文章介绍的方法不算原创了,只是引用的别人的文章,加上自己的注释,因为接触php时间不长,所以尝试的东西比较多,自己加的注释也比较简单,php高手请略过. 我要用到远程下载图片,是在做微信公众平台 ...
- YII框架学习(二)
YII框架的增删改查 例:一个新闻表的增删改查: (1)首先使用gii工具生成控制器和模型 (2)控制器 <?php class NewsController extends Controlle ...
- python 基础 1.5 python数据类型(四)--字典
一.python 数据类型--字典 1.用字符串存储信息,如:存储“姓名,身高,性别”: In [1]: info='Tom 170 M' //字符串存储信息 In [3]: info[0:3] // ...
- 修改linux的hostname (修改linux系统的IP和hostname)
# vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=yourname //在这修改hostnameNISDOMAIN=eng-cn.platform.c ...