最小生成树问题;
选n-1条边;
#include<bits/stdc++.h> using namespace std; //因为给边了,所以用最小生成树 const int maxn=10100; int n,m,c,sum=0,f[maxn]; struct e{ int u,v,w; }edge[2*maxn]; int find(int x) { if(x==f[x]) return x; else return f[x]=find(f[x]); } bool cmp(e i,e j) { return i.w<j.w; } void krusal() { for(int i=1;i<=n;i++) { int cnt=0,eu=find(edge[i].u),ev=find(edge[i].v); if(eu!=ev) { f[eu]=ev; sum+=edge[i].w; cnt++; } if(cnt==n-1) return; } } int main() { while(scanf("%d %d %d",&c,&n,&m)!=EOF) { sum=0; memset(edge,0,sizeof(edge)); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); edge[i].u=u,edge[i].v=v,edge[i].w=w; } sort(edge+1,edge+1+n,cmp); krusal(); if(sum<=c) printf("Yes\n");//如果花费小于所给经费,则满足 else printf("No\n"); } }