luogu1991 无线通讯网
生活随笔
收集整理的這篇文章主要介紹了
luogu1991 无线通讯网
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目大意
國防部計(jì)劃用無線網(wǎng)絡(luò)連接若干個(gè)邊防哨所。2 種不同的通訊技術(shù)用來搭建無線網(wǎng)絡(luò);每個(gè)邊防哨所都要配備無線電收發(fā)器;有一些哨所還可以增配衛(wèi)星電話。任意兩個(gè)配備了一條衛(wèi)星電話線路的哨所(兩邊都?有衛(wèi)星電話)均可以通話,無論他們相距多遠(yuǎn)。而只通過無線電收發(fā)器通話的哨所之間的距離不能超過 D,這是受收發(fā)器的功率限制。收發(fā)器的功率越高,通話距離 D 會(huì)更遠(yuǎn),但同時(shí)價(jià)格也會(huì)更貴。收發(fā)器需要統(tǒng)一購買和安裝,所以全部哨所只能選擇安裝一種型號(hào)的收發(fā)器。換句話說,每一對(duì)哨所之間的通話距離都是同一個(gè) D。你的任務(wù)是確定收發(fā)器必須的最小通話距離 D,使得每一對(duì)哨所之間至少有一條通話路徑(直接的或者間接的)。
題解
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std;const int MAX_NODE = 510, MAX_EDGE = MAX_NODE * MAX_NODE;struct Node {int X, Y;Node *Father; }_nodes[MAX_NODE]; int TotNode, S;struct Edge {Node *From, *To;double Weight;bool operator < (const Edge& a) const{return Weight < a.Weight;} }_edges[MAX_EDGE]; int _eCount;double Dist(Node& a, Node& b) {int dx = a.X - b.X, dy = a.Y - b.Y;return sqrt(dx * dx + dy * dy); }Node *FindRoot(Node *cur) {return cur->Father == cur ? cur : cur->Father = FindRoot(cur->Father); }double Kruskal() {for (int i = 1; i <= TotNode; i++)_nodes[i].Father = _nodes + i;sort(_edges + 1, _edges + _eCount + 1);int cnt = 0;for (int i = 1; i <= _eCount; i++){Edge *e = _edges + i;Node *root1 = FindRoot(e->From), *root2 = FindRoot(e->To);if (root1 != root2){root1->Father = root2;cnt++;if (cnt == TotNode - S)return e->Weight;}}return -1; }int main() {scanf("%d%d", &S, &TotNode);for (int i = 1; i <= TotNode; i++)scanf("%d%d", &_nodes[i].X, &_nodes[i].Y);for (int i = 1; i <= TotNode; i++)for (int j = i + 1; j <= TotNode; j++){Edge *e = _edges + ++_eCount;e->From = _nodes + i;e->To = _nodes + j;e->Weight = Dist(_nodes[i], _nodes[j]);}printf("%.2f\n", Kruskal());return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/headboy2002/p/9463207.html
總結(jié)
以上是生活随笔為你收集整理的luogu1991 无线通讯网的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓Dialog对话框多次显示而闪退的解
- 下一篇: 课时18:函数:灵活即强大