HDU-1875-畅通工程再续
来源:互联网 发布:wtaps15aw军裤数据 编辑:程序博客网 时间:2024/05/16 06:34
题解:先求出每个岛之间的距离,然后再赋值给邻接矩阵,一个要注意的地方是:将距离大于0.0且小于10.0的距离,赋一个大于1000.0的数。接着就用Prim算法求解。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double map[105][105];
#define MAX 1000.0
#define MIN 10.0
struct G
{
int x;
int y;
};
double Distance(G w1, G w2)
{
int wx = abs(w1.x - w2.x);
int wy = abs(w1.y - w2.y);
double w = sqrt(wx*wx + wy*wy);
return w;
} //求两岛之间距离
bool used[105];
double lowcost[105] = { 0 };
void Prim(int n)
{
double minsum = 0.0;
for (int i = 0; i < n; i++)
{
lowcost[i] = map[0][i];
used[i] = false;
}
used[0] = true;
int m = 1;
for (int j = 0; j < n; j++)
{
double min = MAX;
int v = -1;
for(int k = 0; k < n; k++)
{
if (!used[k] &&lowcost[k] <= min)
{
min = lowcost[k];
v = k;
}
}
if(v != -1)
{
m++;
used[v] = true;
minsum += lowcost[v];
for (int t = 0; t < n; t++)
{
if (!used[t] && map[v][t] < lowcost[t])
lowcost[t] = map[v][t];
}
}
}
if (m != n)
printf_s("oh!\n");
else
printf_s("%.1lf\n", minsum*100);
}
int main()
{
int T,C;
G gg[105];
cin >> T;
while (T--)
{
cin >> C;
for (int i = 0; i < C; i++)
{
cin >> gg[i].x >> gg[i].y;
}
for (int i = 0; i < C; i++)
{
for (int j = i; j < C; j++)
{
double d = Distance(gg[i], gg[j]);
if(d<MIN&&d>0.0) //将距离大于0.0且小于10.0的距离,赋一个大于1000.0的数
{
map[i][j] = 2000.0;
map[j][i] = 2000.0;
}
else
{
map[i][j] = d;
map[j][i] = d;
}
}
}
Prim(C);
}
return 0;
}
- HDU 1875 畅通工程再续
- HDU 1875 畅通工程再续
- acm hdu 1875 畅通工程再续
- hdu 1875 畅通工程再续 (kruskal)
- hdu 1875 畅通工程再续
- HDU 1875 畅通工程再续
- hdu 1875 畅通工程再续
- hdu 1875 畅通工程再续
- hdu 1875 畅通工程再续
- HDU 1875 畅通工程再续
- hdu 1875 畅通工程再续
- hdu 1875 畅通工程再续
- hdu 1875 畅通工程再续
- HDU-1875-畅通工程再续
- HDU-畅通工程再续-1875
- hdu 1875 畅通工程再续
- HDU 1875 畅通工程再续
- hdu(1875)畅通工程再续
- 2016.5.27笔记
- ShareSDK集成微信、QQ、微博分享
- 有道字典主窗口初始化失败、暴风影音停止工作的诡异问题
- 如何实现动态生成类型不定的数组
- NSString字符串使用详解
- HDU-1875-畅通工程再续
- 正则表达式
- 最进公共祖先(LCA)
- vertica-磁盘执行export出现insufficient space报错
- "undefined reference to" 问题解决方法
- 哈理工OJ—1013 Eqs(数学怪题)
- Android聊天室
- 第12周项目2-Time类中的运算符重载
- 《人生》续集