首页 > 代码库 > 【TYVJ】1307 联络员(最小生成树)
【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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。