这是prim的一个变型,求最小生成树中,最大的一条边,代码写法基本上也是一样的
- #include<iostream>
- #include<cstdio>
- #include <vector>
- using namespace std;
- const int MAX = 501;
- const int INF = 65537;
- int c[MAX][MAX];
- bool flag[MAX];
- vector<int> U_Set;
- //这道题目是prim的一个变形,求最小生成树中的,最大的一段长度
- int Prim(int n)
- {
- int ans = 0;
- U_Set.push_back(1);
- flag[1] = true;
- for(int i = 1; i < n; i++)
- {
- int start = 1;
- int k = 1;
- int end = 1;
- int min = INF;
- int U_len = U_Set.size();
- for(int p=0;p<U_len;p++) {
- start = U_Set[p];//每次取出U集合中一个点,与不是U集合中的点比较,取路程最小的一个
- for(k=1;k<=n;k++)
- {
- if(start!=k&&c[start][k]<min&&!flag[k])
- {
- min = c[start][k];
- end = k;
- }
- }
- }
- //找到那个点以后,flag置为true
- flag[end] = true;
- U_Set.push_back(end);
- //边为start----end
- //找到最小生成树中最大的那段
- if(ans<min)
- ans = min;
- }
- return ans;
- }
- int main() {
- int i, j, n, m,T=1;
- cin>>T;
- while(T-->0) {
- cin>>n;
- for(i = 1; i <= n; i++)
- {
- for(j = 1; j <=n; j++)
- {
- //这里用cin会TLE
- scanf("%d",&c[i][j]);
- }
- }
- cout<<Prim(n)<<endl;
- memset(flag,0,sizeof(flag));
- U_Set.clear();
- }
- return 0;
- }