【题意分析】

  给你一张无向图,求其最小瓶颈生成树的值。

【解题思路】

  有一个很显然的定理:任意一张无向图的最小生成树即为最小瓶颈生成树。所以求最小生成树的时候取边权的最大值即可。

  或者可以修改Dijkstra算法,dis[i]表示当前i离最小瓶颈生成树的最小瓶颈值,也可以证明是具有最优子结构的。

  复杂度最低O(nlog2n)。

【参考程序】

 1 #pragma GCC optimize(2)
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #define REP(i,low,high) for(register int i=(low);i<=(high);i++)
 6 using namespace std;
 7 template<typename T> inline bool getmin(T &tar,const T &pat) {return pat<tar?tar=pat,1:0;}
 8 template<typename T> inline bool getmax(T &tar,const T &pat) {return pat>tar?tar=pat,1:0;}
 9 bool usd[310]; int n,m,dst[310],edg[310][310];
10 int main()
11 {
12     memset(dst,0x7f,sizeof dst),memset(edg,0x7f,sizeof edg),memset(usd,0,sizeof usd),dst[1]=0;
13     for(scanf("%d%d",&n,&m);m--;) {int u,v,w; scanf("%d%d%d",&u,&v,&w); edg[u][v]=edg[v][u]=w;}
14     REP(times,1,n)
15     {
16         int i=0; REP(j,1,n) if(!usd[j]&&dst[j]<dst[i]) i=j; usd[i]=1;
17         REP(j,1,n) if(!usd[j]) getmin(dst[j],max(dst[i],edg[i][j]));
18     }
19     int ans=0; REP(i,1,n) getmax(ans,dst[i]);
20     return printf("%d %d\n",n-1,ans),0;
21 }
View Code