口袋的天空
最小生成树版子题
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; int n,m,k,ans,fa[10005],cnt; struct Node{ int x; int y; int l; }a[10005]; inline bool cmp(const Node &a,const Node &b){ return a.l<b.l; } inline int Find(int i){ if(fa[i]==i)return i; return fa[i]=Find(fa[i]); } int main(){ scanf("%d%d%d",&n,&m,&k); for(register int i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].l); sort(a+1,a+m+1,cmp); for(register int i=1;i<=m;i++) fa[i]=i; cnt=n; for(register int i=1;i<=m;i++){ int f1,f2; f1=Find(a[i].x); f2=Find(a[i].y); if(f1!=f2){ fa[f1]=f2; cnt--; ans+=a[i].l; } if(cnt==k)break; } if(ans==0)printf("No Answer\n"); else printf("%d\n",ans); return 0; }