至於那個貪心的證明我是沒整出來的。。。看了黑書,可能是我沒有認真看吧。
最小路徑點覆蓋:用最少的邊去覆蓋盡可能多的點(全部)。黑書上介紹了乙個求最小路徑點覆蓋的方法,很值得借鑑,那就是每個點
i 轉化為乙個i和
i′,當原圖存在邊(i
,j) 時,連邊(i
,j′)
,求這個s−
t 割的最大二分圖匹配,再用點數-這個值即為最小路徑點覆蓋。
為什麼呢?因為假定原圖每條邊只對應乙個點,那麼
n 個點需要
n條邊去覆蓋。每存在一條連了2個點的邊就可以省去一條邊,而這個二分圖匹配能保證是互不有重疊點的邊集的最大值,所以肯定最多能省去這麼多條邊;能省去這麼多條邊後自然省去每條邊對應的那個點;因而用總點數-最大匹配即為答案。
具體到這個題,就是把兩個和為完全平方數的兩球連一條邊,列舉,資料比較小,能過。而且我並不覺得設乙個上界和下界去二分能提公升多大的速度,所以直接用fo
r 列舉。
唯一注意的是,上一次列舉完的邊還可以用的 要加的邊只是所有點到多的點還要加的邊。然後這樣的話跑cogs的資料足夠。。。。
然後還是要用匈牙利演算法求最大匹配;judge函式用來判斷是否和為平方數。
**
#include
#include
#include
#include
#include
#include
#include
#include
//ac
using
namespace
std;
const
int maxn=10000;
vector
g[maxn];
void addedge(int from,int to)
int match[maxn];
bool book[maxn];
int n;
bool judge(int n)
return
false;
}bool dfs(int v)}}
return
false;
}bool cal(int res)
}int ans=0;
for(int i=1;i<=res;i++)}}
return (res-ans)<=n;
}int main()
}printf("%d\n",ans-1);
return
0;}
網路流24題 COGS 750 柵格網路流
輸入檔案 flowa.in輸出檔案 flowa.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 bob 覺得一般圖的最大流問題太難了,他不知道如何解決,於是他想嘗試乙個簡單點的 柵格網路中的最大流問題,這個雖說簡單了一點,但對 bob 來說依舊太難,現在他有個麻煩需要你幫忙 給...
COGS461 網路流24題 餐巾
問題描述 乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f 3 把餐巾送到慢洗部,洗一塊需n天 n m 費用需s分 s在每天結束時,餐廳必須決定多少塊用過的餐巾送到快洗部,...
網路流 24 題
1 搭配飛行員 題意 n個飛行員,其中有m名飛行員是正駕駛員。飛機每架有兩個駕駛員,需乙個正駕駛員和乙個副駕駛員。由於種種原因,例如相互配合的問題,有些駕駛員不能在同一架飛機上飛行,問如何搭配駕駛員才能使出航的飛機最多。思路 裸二分圖匹配 最大流 題 版本一 網路流做法 引入源點s 0以及匯點t n...