Floyed 匈牙利演算法 二分答案 飛彈

2021-10-23 15:26:56 字數 2447 閱讀 5937

給出一張無向的完全圖(任意兩點之間都有一條邊的圖)g=(v,e),它可以表示出某一塊大陸的地圖:每個頂點表示一座城市,每條邊代表連線的兩個城市間的距離,該大陸任兩個城市都是直接連通的。另外在這個大陸上有兩個特殊的國家,我們稱為a國與b國,其中a國有n個城市,b國有m個城市。

這裡a國相對於b國來說是乙個大國(我們有n>=m),而且它最近發明了一種新型**:響尾蛇飛彈(a crotalid missile),這種**威力十分巨大,以至於每枚飛彈都可以摧毀任意一座城市。a國**在戰略安排上要求a國管轄的每個城市都配備一枚這種響尾蛇飛彈。b國竊取到了這個情報,b國**當然不能坐以待斃,他感覺受到了強大的威脅,於是要求他們的科學家們盡快研製出乙個飛彈防禦系統來抵禦將來可能遭受的攻擊。當然這個防禦系統必須是可靠且有效的,因此在製造系統之前b國的科學家們必須首先考慮清楚該系統的反應速度如何確定。所以作為b國最聰明科學家之一的你,必須盡快算出a國要摧毀b國所有城市至少需要的時間是多少。

輸入輸入第一行為乙個整數k,表示這塊大陸的頂點數。接下來k行,每行包含k個整數,描述了城市的連線情況。這個k*k的矩陣中,matrix[i][j]表示城市i到城市j的距離,這也是飛彈由城市i到城市j間的飛行時間。這裡有:matrix[i][j]=matrix[j][i],matrix[i][i]=0,1<=matrix[i][j]<=100。

接下來一行為整數n,1<=n<=k,為a國的城市數。下面一行n個整數,列出a國管轄的城市編號。

再下來一行為整數m,1<=m<=n,為b國的城市數。下面一行m個整數,列出b國管轄的城市編號。

a國與b國管轄的所有城市編號均不相同。

輸出輸出檔案只有一行,為飛彈摧毀b國所有城市至少所需要的時間。

輸入樣例

30 2 1

2 0 10

1 10 012

13輸出樣例

說明本題共8個資料點,資料點與k大小對應關係:

1:k=2;

2:k=5;

3:k=10;

4:k=25;

5:k=46;

6:k=72;

7,8:k=100;

先floyed求出兩點最短距(k挺小的)

二分,只計算小於等於mid的邊

然後再用匈牙利演算法逐一匹配。

(匈牙利演算法大概就是——你能連別的點就讓開,不能的話自己就找下乙個點)

#include

#include

#include

#include

using

namespace std;

int tot,n,n1,n2,k[

1001

],a[

1001

],b[

1001

],f[

1001][

1001

],l,r,mid,ll[

1001

],b[

1001];

struct asdf a[

10001];

bool

find

(int x)

if(k[b[a[i]

.to]]==

0)if(

find

(b[a[i]

.to])==

1)}return0;

//自己得不到,別人讓不出

}bool

check

(int liu)

; ll[b[j]

]= tot;

}for

(int i =

1; i <= n2;

++i)

return1;

}void

init()

scanf

("%d"

,&n1)

;for

(int i =

1; i <= n1;

++i)

scanf

("%d"

,&a[i]);

scanf

("%d"

,&n2)

;for

(int i =

1; i <= n2;

++i)

scanf

("%d"

,&b[i]);

for(

int k =

1; k <= n;

++k)

//floyed

for(

int i =

1; i <= n;

++i)

for(

int j =

1; j <= n;

++j)

f[i]

[j]=

min(f[i]

[j], f[i]

[k]+ f[k]

[j]);}

intmain()

printf

("%d"

, r)

;}

演算法基礎 二分答案

二分包括整數二分和浮點數二分,整數二分有兩種情況 兩個模板 浮點數二分只有一種情況 乙個模板 二分本質 如果能找到乙個性質將區間一分為二,一半滿足性質,一半不滿足性質,二分就可以尋找這個性質的邊界 滿足性質的邊界和不滿足性質的邊界都能找到 邊界就是我們要的答案。假設某一性質可以將乙個l到r的區間一分...

二分匹配 匈牙利演算法

這個演算法真心很精妙,其實 很簡單,但是理解其中的奧秘還真要花點時間 matrix67大牛說的好 說穿了,就是你從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配 一條已經匹配過,再下一條又沒匹配這樣交替地出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連...

二分匹配 匈牙利演算法

奆佬的部落格 匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。等等,看得頭大?那麼請看下面的版本 通過數代人的努力,你終於趕...