标签:来源 define scanf 个数 注意 内存 tyvj else ons
★ 输入文件:ugrid.in
输出文件:ugrid.out
简单对比
时间限制:1 s 内存限制:128 MB
如果电网可以覆盖全岛,输出最少需要的电线长度;
若不能,输出无电可用的村庄的个数。
【样例1】 5 5 1 1 2 1 2 3 1 3 4 1 4 5 1 5 1 1 【样例2】 5 5 1 1 2 1 1 2 2 1 2 3 3 4 1 5 4 2
【样例1】 4 【样例2】 3
样例解释:
对于样例一,电网可以覆盖全岛,最短长度为4;
对于样例二,电网无法覆盖3,4,5这3个村庄。
数据范围:
对于20%的数据,有1<m,n<=10;
对于60%的数据,有1<m,n<=1000;
对于100%的数据,有1<m,n<=200000,0<li<=1e+7;
对于40%的数据,电网无法覆盖全岛。
From tbcaaa8 http://www.tyvj.cn/Problem_Show.aspx?id=1591
kruskal
(rank1 蛤蛤)
#include <algorithm> #include <cstdio> #define N 200005 using namespace std; struct Edge { int x,y,z; bool operator<(Edge a)const { return z<a.z; } }e[N]; int n,m,k,cnt,fa[N]; int find_(int x) {return fa[x]==x?x:fa[x]=find_(fa[x]);} int Main() { freopen("ugrid.in","r",stdin); freopen("ugrid.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;++i) fa[i]=i; for(int x,y,z;m--;) { scanf("%d%d%d",&x,&y,&z); e[++cnt]=(Edge){x,y,z}; } sort(e+1,e+1+cnt); int num=0; long long sum=0; for(int i=1;i<=cnt;++i) { int fx=find_(e[i].x),fy=find_(e[i].y); if(fx==fy) continue; fa[fy]=fx; num++; sum+=(long long)e[i].z; if(num==n-1) break; } num=0,k=find_(k); for(int i=1;i<=n;++i) if(find_(i)!=k) num++; if(num) printf("%d\n",num); else printf("%lld\n",sum); return 0; } int sb=Main(); int main(int argc,char *argv[]){;}
标签:来源 define scanf 个数 注意 内存 tyvj else ons
原文地址:http://www.cnblogs.com/ruojisun/p/7608669.html