码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-07 00:23:27      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:blog   http   os   io   for   2014   ar   div   

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

bubuko.com,布布扣

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;
}

 

【TYVJ】1307 联络员(最小生成树),布布扣,bubuko.com

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

标签:blog   http   os   io   for   2014   ar   div   

原文地址:http://www.cnblogs.com/iwtwiioi/p/3895945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!