zoukankan      html  css  js  c++  java
  • 【TYVJ】1307 联络员(最小生成树)

    http://tyvj.cn/Problem_Show.aspx?id=1307

    kruskal裸题。(水题红色警报)

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define read(a) a=getnum()
    #define print(a) printf("%d", a)
    inline int getnum() { int ret=0; char c; int k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0'; return k*ret; }
    
    struct edge {
    	int u, v, w;
    	bool operator < (const edge &a) const { return w<a.w; }
    }e[10005];
    
    int cnt, f[2005];
    int ifind(const int &x) { return x==f[x]?x:f[x]=ifind(f[x]); }
    int main() {
    	int n, m;
    	read(n); read(m);
    	for1(i, 1, n) f[i]=i;
    	int u, v, w, fu, fv, p, ans=0;
    	for1(i, 1, m) {
    		read(p); read(u); read(v); read(w);
    		if(p==1) {
    			ans+=w;
    			f[ifind(u)]=ifind(v);
    		}
    		else e[cnt].u=u, e[cnt].v=v, e[cnt++].w=w;
    	}
    	sort(e, e+cnt);
    	for1(i, 0, cnt) {
    		fu=ifind(e[i].u); fv=ifind(e[i].v);
    		if(fu!=fv) {
    			f[fu]=fv;
    			ans+=e[i].w;
    		}
    	}
    	print(ans);
    	return 0;
    }
    

    描述 Description

    Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络 员,希望你找到一些通信渠道,使得管理员两两都可以联络(直接或者是间接都可以)。Tyvj是一个公益性的网站,没有过多的利润,所以你要尽可能的使费用 少才可以。
       目前你已经知道,Tyvj的通信渠道分为两大类,一类是必选通信渠道,无论价格多少,你都需要把所有的都选择上;还有一类是选择性的通信渠道,你可以从中挑选一些作为最终管理员联络的通信渠道。数据保证给出的通行渠道可以让所有的管理员联通。

    输入格式 InputFormat

    第一行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表示费用。


    输出格式 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

  • 相关阅读:
    探索式测试实践之路
    管理是什么?真正的管理者是,“管”+“理”!
    JavaScript中的函数式编程
    node js的终端中 console.log 嵌套对象会被折叠的问题
    apt-get install的默认安装路径
    nodejs 事件循环 试题思考
    仅20行的JavaScript模板引擎
    js 驼峰命名转烤串
    git reset 进阶
    linux 拷贝文本到剪切板
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3895945.html
Copyright © 2011-2022 走看看