您的位置:首页 > 其它

POJ 2485 Highways

2008-11-20 14:36 375 查看
这是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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: