您的位置:首页 > 其它

poj 2349 Arctic Network(图论:最小生成树)

2014-07-22 16:41 330 查看
题意:有两种不同的通信技术,有卫星通信的两个城市之间可以任意联络,但用无线电通信的城市只能和距离不超过D的城市联系。无线电的能力越高(即传输距离D越大),花费就越大。已知无线电的数目m,让求最小的D。

一道读起来很蛋疼的题,我到现在也没读懂...

不明白样例为什么对应的是212.13

样例对应生成树的三条边应该为:200, 212.13, 300

反正这个题目考查的是prim,找到SPT上的所有边,排序再输出特定边就可以了

代码如下:

#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
#define INF 0x7fffffff
using namespace std;

double dis[MAXN], g[MAXN][MAXN], edge[MAXN];
int n, m;

struct Point {
int x, y;
}a[MAXN];

double get_dis(int i, int j) {
return sqrt(pow(1.0*(a[i].x-a[j].x), 2.0) + pow(1.0*(a[i].y-a[j].y), 2.0));
}

bool cmp(double i, double j) {
return i>j;
}

double prim() {
int now, minnode, i, j, cnt;
double minedge, ans;
for(i=0; i<m; ++i)
dis[i] = INF;
now = 0;
ans = 0.0;//ans可以不要
cnt = 0;
for(i=0; i<m-1; ++i) {
dis[now] = -1;
minedge = INF;
for(j=0; j<m; ++j) {
if(now!=j && dis[j]>=0) {
dis[j] = min(dis[j], g[now][j]);
if(dis[j] < minedge) {
minedge = dis[j];
minnode = j;
}
}
}
edge[cnt++] = minedge;//最小生成树的边集
ans += minedge;
now = minnode;
}
sort(edge, edge+cnt, cmp);//从大到小排序
/*
for(i=0; i<cnt; ++i)
printf("edge[%d] = %.2f\n", i, edge[i]);
*/
return edge[n-1];
}

int main(void) {
int T, i, j;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(i=0; i<m; ++i)
scanf("%d%d", &a[i].x, &a[i].y);
for(i=0; i<m; ++i) {
for(j=i+1; j<m; ++j) {
g[i][j] = g[j][i] = get_dis(i, j);
}
}
cout.setf(ios::fixed);//限定cout输出精度
cout.precision(2);
cout << prim() << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: