洛谷P1661 yzoj 1650 擴散 題解

2022-05-06 21:24:11 字數 1138 閱讀 1267

題意

先講一下一種容易陷入誤區錯誤思路

要使時間最小,就去找相對於每個點的最短曼哈頓距離,然後取最大值,時間就是(maxn+1)/2。

**

#include#include#include#include#include#define ll long long

#define mx 55

using namespace std;

int d[mx][mx];

int x[mx],y[mx];

int ans=0;

int man=1<<30;

int n;

int main()

for(int i=1;i<=n;++i)

} for(int i=1;i<=n;++i)

ans=max(ans,man);

} printf("%d",(ans+1)/2);

return 0;

}

這樣做只有20分,為什麼錯了?

因為每次取最小的會使你遺漏邊,有些邊是一定要選的卻沒選,不選的話會導致聯通塊不連通,舉個例子吧

咕咕,因為圖床問題暫時咕咕

如果按照上面的方法就只會選到紅邊,但黑邊至少要選一條,這就會導致聯通塊不連通,所以錯誤了。

正解一種比較巧妙的方法,可以看作在最長距離中找乙個最短的曼哈頓距離便可以二分,判斷聯通可以用並查集或者bfs。

**

#includeusing namespace std;

int n,ans,l,r,cnt,fa[60],zx[60],zy[60];

int find(int x)

int main()

l=0,r=1e9;

while(l<=r)

for(int i=1;i<=n;++i)

}} cnt=0;

for(int i=1;i<=n;++i)

if(cnt==1) r=mid-1;

else l=mid+1;

} printf("%d",l);

return 0;

}

另外這道題還可以計算出任意兩點間聯通的時間,然後求最小生成樹(mst),則mst的最大邊就是答案。因為mst的性質之一就是滿足任意兩點間的最大邊權最小。

洛谷P1650 田忌賽馬 楊子曰題目

題目描述田忌很沮喪,直到他遇到了著名的軍師 孫臏。田忌採用了孫臏的計策之後,三場比賽下來,輕鬆而優雅地贏了齊王200銀幣。這實在是個很簡單的計策。由於齊王總是先出最好的馬,再出次好的,所以田忌用常規馬對齊王的超級馬,用自己的超級馬對齊王的上級馬,用自己的上級馬對齊王的常規馬,以兩勝一負的戰績贏得20...

洛谷P1661擴散 二分 並查集

首先我們先二分答案,然後用並查集記錄有多少個聯通塊。如果兩個聯通塊成為乙個聯通塊,則他們的哈密頓距離小於擴散時間的一半。因此可以二分答案,檢查是否等於乙個聯通塊就行了。include include include include using namespace std typedef long l...

洛谷P1661 資訊奧賽一本通1437 擴散

洛谷 資訊奧賽一本通 時間限制 1000 ms 記憶體限制 65536 kb 提交數 676 通過數 347 乙個點每過乙個單位時間就會向四個方向擴散乙個距離,如圖。兩個點a a b b 連通,記作e a b e a,b 當且僅當a a b b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u ...