题目
一个无向图,求最小生成树里权值最大的那条边
输入
第一行有两个整数n,m表示有n个店,m条边。接下来m行是对每条边的描述,u, v, c表示点u和v之间有边,权值为c。(1≤n≤300,1≤c≤10000)
4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
输出
两个整数s, max,表示你有几条边,权值最大的那条边的权值是多少。
3 6
解题思路
我们知道最小生成树一点是n-1条边的,然后求最大值很简单
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,k,cost[301][301],lowcost[301],x,y,w,s,last,maxs;
bool ok[301];
int main()
{scanf("%d%d",&n,&k);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++) cost[i][j]=23333333;//初始化for (int i=1;i<=k;i++){scanf("%d%d%d",&x,&y,&w);cost[x][y]=w;cost[y][x]=w;//联通}for (int i=1;i<=n;i++) lowcost[i]=cost[1][i];//离集合的距离ok[1]=true;//封路for (int i=2;i<=n;i++){int k=0,mins=23333333;for (int j=1;j<=n;j++)if (!ok[j] && lowcost[j]<mins){mins=lowcost[j];k=j;}//求最近点ok[k]=true;//封路s=max(s,lowcost[k]);//求最大值for (int j=1;j<=n;j++)if (lowcost[j]>cost[k][j]) lowcost[j]=cost[k][j]; //修正离集合最近的距离}printf("%d %d",n-1,s);//输出
}