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.

联络员(最小生成树)相关推荐

  1. 最小生成树(模板题:最优布线问题,繁忙的都市,联络员)(C++)

    文章目录 序言 正文 First Promble 最优布线问题 时间限制: 1000 m s 1000 ms 1000ms 空间限制: 262144 K B 262144 KB 262144KB 题目 ...

  2. 最小生成树-----------联络员

    Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直 ...

  3. 【TYVJ】1307 联络员(最小生成树)

    http://tyvj.cn/Problem_Show.aspx?id=1307 kruskal裸题.(水题红色警报) #include <cstdio> #include <cst ...

  4. 【图论专题】最小生成树及其简单应用

    整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 1140. 最短网络 prim模板 AcWing 1141. 局域网 kruskal模板 AcWing 1142. 繁忙的都市 ...

  5. AcWing 1143. 联络员

    题目 Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联 ...

  6. 1143 联络员(kruskal算法)

    1. 问题描述: Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员 ...

  7. 联络员(最短路-kruskal)

    Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直 ...

  8. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  9. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

    L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...

最新文章

  1. vector,数组,动态数组效率测试
  2. Information Theory, Inference, and Learning Algorithms
  3. Web前端开发JavaScript基础(3)
  4. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
  5. MySQL笔记——外键约束和表关系(一对一,多对一,多对多)
  6. python中函数参数*args和**kw的区别
  7. oracle 存储结构 语法 第一阶段
  8. android view state,Android状态系统(二)——View状态组合
  9. 手游服务器源码 https,python手游服务端搭建(转)
  10. 基于verliog的异步模10计数器(含模块代码以及测试代码)
  11. PS利用色彩范围抠图
  12. 博士申请 | 加拿大麦克马斯特大学郑榕教授招收全奖博士生/博士后
  13. Python计算卡方值
  14. 前端——列表、表格、表单
  15. [折腾日记]win10 ,ubuntu双系统安装避坑指南
  16. 唱吧android逆向加密算法笔记 此文章已做脱敏处理不会对原厂家app安全构成威胁,仅供学习
  17. 蓝桥杯 算法训练 印章
  18. 将格林威治时间转换为北京时间
  19. 安装JDK+SDK+eclipse+Android Studio+模拟器(夜神OK,AVD黑屏)
  20. Vue3和码上掘金实现猜数字小游戏

热门文章

  1. linux igmp 属于那层协议,Linux下IGMP协议测试工具的开发与应用
  2. Java后端之数据库操作事务回滚
  3. 爬取新浪微博新闻,包括模拟登陆,数据存储等!最适合新手的教程
  4. 禁止scrollview上下拖动
  5. python爬取豆瓣电影信息可行性分析_Python爬虫实现的根据分类爬取豆瓣电影信息功能示例...
  6. 2008年中国各省市人口排名(包含港澳台)
  7. 单片机音乐门铃实验报告 C语言,基于单片机的音乐门铃
  8. 小米手机html无法播放本地视频教程,小米VR正式版怎么看本地视频?小米VR看第三方视频方法教程...
  9. 作业调度和进程调度有什么关系
  10. 项目管理----计划------WPS画甘特图做任务排期