链接:
https://www.nowcoder.net/acm/contest/76/B
来源:牛客网
题目描述
随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)
输入描述:
测试输入包含多条测试数据 每个测试数据的第1行分别给出可用的经费c(<1000000),道路数目n(n<10000),以及城市数目m(<100)。 接下来的n行给出建立公路的成本信息,每行给出三个整数,分别是相连的两个城市v1、v2(0<v1,v2<=m)以及建设公路所需的成本h(h<100)。
输出描述:
对每个测试用例,输出Yes或No。
题意:求一个图的最小生成树,判断其花费是否超过你的经费。
思路:kruskal水过,注意是双向边。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
ll u,v,w;
}edge[20020];
ll c,n,m,f[110],cnt;
ll fd(ll x)
{
if(f[x]!=x)
{
f[x]=fd(f[x]);
}
return f[x];
}
ll Union(ll a,ll b)
{
ll p1=fd(a);
ll p2=fd(b);
if(p1!=p2)
{
f[p2]=p1;
return 1;
}
return 0;
}
bool cmp(node p1,node p2)
{
return p1.w<p2.w;
}
int main()
{
ll x,y,z;
while(~scanf("%lld%lld%lld",&c,&m,&n))
{
cnt=0;
for(ll i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
edge[++cnt].u=x;
edge[cnt].v=y;
edge[cnt].w=z;
edge[++cnt].u=y;
edge[cnt].v=x;
edge[cnt].w=z;
}
sort(edge+1,edge+cnt+1,cmp);
for(ll i=1;i<=n;i++)f[i]=i;
ll ans=0,k=0;
for(ll i=1;i<=cnt;i++)
{
if(Union(edge[i].u,edge[i].v))
{
ans+=edge[i].w;
k++;
if(k==n-1)break;
}
}
if(ans<=c)printf("Yes\n");
else printf("No\n");
}
return 0;
}