您的位置:首页 > 其它

POJ 2485 Highways 最小生成树

2016-07-25 15:14 344 查看
题目要求:求一个最小生成树的最大边的权值,直接Prim,这题从上午十一点开始TLE,一直到下午15:06分坐了出来,一直TLE->WA->TLE->PE,不过最后还是做出来了,TLE的原因主要是book标记数组必须用bool类型,~~~~~,中间还用了Kruskal的算法,也是TLE,不知道为什么,总之好无语~~~~~Prim的代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define inf 0x3f3f3f

using namespace std;

int a[550][550];
int dis[550];
bool book[550];

int main()
{
int t;
cin >> t;
int n;
int i, j, k;
while(t--){
memset(book,false,sizeof(book));
cin >> n;
for(i = 1;i <= n;i++){
for(j = 1;j <= n;j++)
cin >> a[i][j];
}
for(i  = 1;i <= n;i++){
dis[i] = a[1][i];
}
book[1] = true;
int cnt =1;
int sum = 0;
int min;
while(cnt < n){
min = inf;
for(i = 1;i <= n;i++){
if( !book[i] && dis[i] < min){
min = dis[i];
j = i;
}
}
cnt++;
book[j] = true;
if(sum < min)//sum表示最大边的权值,只要一个边加入到最小生成树中去,就与sum比较,比sum大的话,更新sum
sum = min;
for(k = 1;k <= n;k++){
if( !book[k] && dis[k] > a[j][k]){
dis[k] = a[j][k];
}
}
}
cout << sum << endl;
}

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