poj 3522(求最小生成树,使得最边和最小边差最小)

    枚举最小边,用kruskal求生成树,不断更新最小值就可以了。
 给定一个简单图,n个点,m条边( 1<=n<=100,0 ≤ m ≤ n(n − 1)/2 ),要求一颗生成树,使得其最大边与最小边的差值是所有生成树中最小的,输出最小的那个差值。
分析:
  类似于kruskal算法求最小生成树,将所有边按权值大小排升序,e1,e2,e3,...em。
  枚举每条边ei,对ei,ei+1,ei+2,ei+3...进行求生成树,不断更新差值得到最优值。
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 using namespace std;
 
 #define mpair make_pair
 #define pii pair
 #define MM(a,b) memset(a,b,sizeof(a));
 typedef long long lld;
 typedef unsigned long long u64;
 template bool up_max(T& a,const T& b){return b>a? a=b,1 : 0;}
 template bool up_min(T& a,const T& b){return b= ans ) break; ///
             }
         }
         if( cnt == n-1 ) up_min( ans, mmax-mmin );
     }
     return ans;
 }
 
 int main()
 {
     while( cin>>n>>m, (n+m) ){
         for(int i=1;i<=m;++i)
             edge[i].read();
         sort( edge+1, edge+1+m );
 
         int ans= solve();
         if( ans!=inf ) cout<< ans <


你可能感兴趣的:(poj,图论)