联络员(最小生成树)
Description
Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直接或者是间接都可以)。Tyvj是一个公益性的网站,没有过多的利润,所以你要尽可能的使费用少才可以。 目前你已经知道,Tyvj的通信渠道分为两大类,一类是必选通信渠道,无论价格多少,你都需要把所有的都选择上;还有一类是选择性的通信渠道,你可以从中挑选一些作为最终管理员联络的通信渠道。数据保证给出的通行渠道可以让所有的管理员联通。
Input
第一行n,m表示Tyvj一共有n个管理员,有m个通信渠道第二行到m+1行,每行四个非负整数,p,u,v,w 当p=1时,表示这个通信渠道为必选通信渠道;当p=2时,表示这个通信渠道为选择性通信渠道;u,v,w表示本条信息描述的是u,v管理员之间的通信渠道,u可以收到v的信息,v也可以收到u的信息,w表示费用。
Output
最小的通信费用
SampleInput
Sample Output
5 6
1 1 2 1
1 2 3 1
1 3 4 1
1 4 1 1
2 2 5 10
2 2 5 5
Hint
样例解释:
1-2-3-4-1存在四个必选渠道,形成一个环,互相可以到达。需要让所有管理员联通,需要联通2和5号管理员,选择费用为5的渠道,所以总的费用为9
注意:
U,v之间可能存在多条通信渠道,你的程序应该累加所有u,v之间的必选通行渠道
数据范围:
对于30%的数据,n<=10 m<=100
对于50%的数据, n<=200 m<=1000
对于100%的数据,n<=2000m<=10000
先把必选通信渠道合并,用并查集打最小生成树。
var
p,r:array [1..2001] of longint;
a:array [1..10001,1..3] of longint;
n,m,p1,u,v,w,ans,k,i:longint;
function find(x:longint):longint;
var y,root,w:longint;
begin
y:=x;
while p[y]>0 do
y:=p[y];
root:=y;
y:=x;
while p[y]>0 do
begin
w:=p[y];
p[y]:=root;
y:=w;
end;
find:=root;
end;
procedure union(x,y:longint);
var
u,v:longint;
begin
u:=find(x);
v:=find(y);
if u=v then exit;
if r[u]<=r[v] then
begin
p[u]:=v;
if r[u]=r[v] then inc(r[v]);
end
else p[v]:=u;
end;
procedure qsort(l,r:longint);
var
i,j,key,temp:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[l+random(r-l+1),3];
repeat
while (a[i,3]<key) do inc(i);
while (a[j,3]>key) do dec(j);
if i<=j then
begin
temp:=a[i,1];a[i,1]:=a[j,1];a[j,1]:=temp;
temp:=a[i,2];a[i,2]:=a[j,2];a[j,2]:=temp;
temp:=a[i,3];a[i,3]:=a[j,3];a[j,3]:=temp;
inc(i);dec(j);
end;
until i>j;
qsort(l,j);
qsort(i,r);
end;
begin
readln(n,m);
for i:=1 to m do
begin
readln(p1,u,v,w);
if p1=1 then
begin
ans:=ans+w;
union(u,v);
end
else
begin
inc(k);
a[k,1]:=u;
a[k,2]:=v;
a[k,3]:=w;
end;
end;
qsort(1,k);
for i:=1 to k do
begin
if find(a[i,1])<>find(a[i,2]) then
begin
union(a[i,1],a[i,2]);
ans:=ans+a[i,3];
end;
end;
write(ans);
end.
联络员(最小生成树)相关推荐
- 最小生成树(模板题:最优布线问题,繁忙的都市,联络员)(C++)
文章目录 序言 正文 First Promble 最优布线问题 时间限制: 1000 m s 1000 ms 1000ms 空间限制: 262144 K B 262144 KB 262144KB 题目 ...
- 最小生成树-----------联络员
Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直 ...
- 【TYVJ】1307 联络员(最小生成树)
http://tyvj.cn/Problem_Show.aspx?id=1307 kruskal裸题.(水题红色警报) #include <cstdio> #include <cst ...
- 【图论专题】最小生成树及其简单应用
整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 1140. 最短网络 prim模板 AcWing 1141. 局域网 kruskal模板 AcWing 1142. 繁忙的都市 ...
- AcWing 1143. 联络员
题目 Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联 ...
- 1143 联络员(kruskal算法)
1. 问题描述: Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员 ...
- 联络员(最短路-kruskal)
Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直 ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)
L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...
最新文章
- vector,数组,动态数组效率测试
- Information Theory, Inference, and Learning Algorithms
- Web前端开发JavaScript基础(3)
- python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
- MySQL笔记——外键约束和表关系(一对一,多对一,多对多)
- python中函数参数*args和**kw的区别
- oracle 存储结构 语法 第一阶段
- android view state,Android状态系统(二)——View状态组合
- 手游服务器源码 https,python手游服务端搭建(转)
- 基于verliog的异步模10计数器(含模块代码以及测试代码)
- PS利用色彩范围抠图
- 博士申请 | 加拿大麦克马斯特大学郑榕教授招收全奖博士生/博士后
- Python计算卡方值
- 前端——列表、表格、表单
- [折腾日记]win10 ,ubuntu双系统安装避坑指南
- 唱吧android逆向加密算法笔记 此文章已做脱敏处理不会对原厂家app安全构成威胁,仅供学习
- 蓝桥杯 算法训练 印章
- 将格林威治时间转换为北京时间
- 安装JDK+SDK+eclipse+Android Studio+模拟器(夜神OK,AVD黑屏)
- Vue3和码上掘金实现猜数字小游戏
热门文章
- linux igmp 属于那层协议,Linux下IGMP协议测试工具的开发与应用
- Java后端之数据库操作事务回滚
- 爬取新浪微博新闻,包括模拟登陆,数据存储等!最适合新手的教程
- 禁止scrollview上下拖动
- python爬取豆瓣电影信息可行性分析_Python爬虫实现的根据分类爬取豆瓣电影信息功能示例...
- 2008年中国各省市人口排名(包含港澳台)
- 单片机音乐门铃实验报告 C语言,基于单片机的音乐门铃
- 小米手机html无法播放本地视频教程,小米VR正式版怎么看本地视频?小米VR看第三方视频方法教程...
- 作业调度和进程调度有什么关系
- 项目管理----计划------WPS画甘特图做任务排期