「JoyOI1307」联络员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct data{ int x,y,v; }e[20001]; int n,m,father[2001],cnt,ans; int find(int x){return x==father[x]? x:father[x]=find(father[x]);} inline bool cmp(data a,data b){return a.v<b.v;} void un(int x,int y,int v) { father[find(x)]=find(y); ans+=v; } void insert(int x,int y,int v) { cnt++; e[cnt].x=x;e[cnt].y=y; e[cnt].v=v; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)father[i]=i; for(int i=1;i<=m;i++) { int flag,x,y,v; scanf("%d%d%d%d",&flag,&x,&y,&v); if(flag==1)un(x,y,v); else insert(x,y,v); } sort(e+1,e+cnt+1,cmp); for(int i=1;i<=cnt;i++) { int x=find(e[i].x),y=find(e[i].y); if(father[x]!=father[y])un(x,y,e[i].v); } printf("%d",ans); return 0; } |
描述 Description
JoyOI已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着JoyOI网站的逐步壮大,管理员的数目也越来越多,现在你身为JoyOI管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直接或者是间接都可以)。JoyOI是一个公益性的网站,没有过多的利润,所以你要尽可能的使费用少才可以。 目前你已经知道,JoyOI的通信渠道分为两大类,一类是必选通信渠道,无论价格多少,你都需要把所有的都选择上;还有一类是选择性的通信渠道,你可以从中挑选一些作为最终管理员联络的通信渠道。数据保证给出的通行渠道可以让所有的管理员联通。
输入格式 InputFormat
第一行n,m表示JoyOI一共有n个管理员,有m个通信渠道 第二行到m+1行,每行四个非负整数,p,u,v,w 当p=1时,表示这个通信渠道为必选通信渠道;当p=2时,表示这个通信渠道为选择性通信渠道;u,v,w表示本条信息描述的是u,v管理员之间的通信渠道,u可以收到v的信息,v也可以收到u的信息,w表示费用。
输出格式 OutputFormat
最小的通信费用
样例输入 SampleInput
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
样例输出 SampleOutput
9
数据范围和注释 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<=2000 m<=10000
注意: U,v之间可能存在多条通信渠道,你的程序应该累加所有u,v之间的必选通行渠道
数据范围: 对于30%的数据,n<=10 m<=100 对于50%的数据, n<=200 m<=1000 对于100%的数据,n<=2000 m<=10000
Subscribe