t 公司發現其研製的乙個軟體中有 n 個錯誤,隨即為該軟體發放了一批共 m 個補丁程式。每乙個補丁程式都有其特定的適用環境,某個補丁只有在軟體中包含某些錯誤而同時又不包含另一些錯誤時才可以使用。乙個補丁在排除某些錯誤的同時,往往會加入另一些錯誤。
換句話說,對於每乙個補丁 i,都有 2 個與之相應的錯誤集合 b1[i]和 b2[i],使得僅當軟體包含 b1[i]中的所有錯誤,而不包含 b2[i]中的任何錯誤時,才可以使用補丁 i。補丁 i 將修復軟體中的某些錯誤 f1[i],而同時加入另一些錯誤 f2[i]。另外,每個補丁都耗費一定的時間。
試設計乙個演算法,利用 t 公司提供的 m 個補丁程式將原軟體修復成乙個沒有錯誤的軟體,並使修復後的軟體耗時最少。對於給定的 n 個錯誤和 m 個補丁程式,找到總耗時最少的軟體修復方案。
第 1 行有 2 個正整數 n 和 m,n 表示錯誤總數,m表示補丁總數,1<=n<=20, 1<=m<=100。
接下來 m 行給出了 m 個補丁的資訊。每行包括乙個正整數,表示執行補丁程式 i 所需時間,以及 2 個長度為 n 的字串,中間用乙個空格符隔開。
第 1 個字串中,如果第 k 個字元 bk 為「+」,則表示第 k 個錯誤屬於 b1[i],若為「-」,則表示第 k 個錯誤屬於 b1[i],若為「0」,則第 k 個錯誤既不屬於 b1[i]也不屬於 b2[i],即軟體中是否包含第 k 個錯誤並不影響補丁 i 的可用性。
第 2 個字串中,如果第 k 個字元 bk為「-」,則表示第 k 個錯誤屬於 f1[i],若為「+」,則表示第 k 個錯誤屬於 f2[i],若為「0」,則第 k 個錯誤既不屬於 f1[i]也不屬於 f2[i],即軟體中是否包含第 k 個錯誤不會因使用補丁i 而改變。
程式執行結束時,將總耗時數輸出。如果問題無解,則輸出 0。
3 3
1 000 00-
1 00- 0-+
2 0-- -++
8
none
這。。。是網路流??
狀壓+最短路啊
瞎搞搞就行了
自以為是的我以為dfs就能水過,然而。。tle。
把dfs改成dij就行了qwq
#include#include#include#include#include#include#define _ 0
#define ll long long
inline ll in()
int n,m;
int a[120],b[120],t[120],c[120],d[120];
int dis[1<<21];
bool vis[1<<21];
using std::priority_queue;
using std::pair;
using std::make_pair;
priority_queue,std::vector>,std::greater> > q;
inline char getc()
inline bool can(int p,int zt)
return true;
}inline void cov(int p,int &zt) }
inline void bfs()
}} }
}int main()
for(int j=1;j<=n;j++)
}memset(dis,0x7f,sizeof dis);
bfs();
dis[0]==0x7f7f7f7f? printf("0"):printf("%d",dis[0]);
return 0;
}
洛谷P2761 軟體補丁問題
題目大意 給出n個錯誤與m種不同的補丁,每種補丁當且僅當b1 i 包含當前狀態的的錯誤,且b2 i 不包含當前狀態下的 錯誤 b1 i 與b2 1 是兩個集合,題目給出 每個補丁都有他自己的執行時間,i補丁會修復在f1 i 裡面的錯誤,同時也會帶來f2 i 裡面的錯誤。因為這個,題目從簡單的二分圖最...
軟體補丁問題
題目鏈結 順著做網路流24題看到的 起初原本以為是費用流 後來看到 n 20 狀壓走起 這題狀壓還是很明顯的,b1,b2,f1,f2 都明顯壓縮,初始狀態 1 n 1 目標狀態 0 這題因為點數太多,直接建邊的話空間代價太大,我們選擇對每個點都跑乙個 m 次的列舉 當現在的狀態 now 滿足 now...
狀壓 軟體補丁問題
不知道為什麼放在網路流24題裡面,我感覺是狀壓。題面乙個軟體中有 n 個錯誤,共 m 個補丁程式。每乙個補丁程式都有其特定的適用環境。對於每乙個補丁 i 都有 2 個與之相應的錯誤集合 b1 i 和,b2 i 使得僅當軟體包含 b1 i 中的所有錯誤,而不包含 b2 i 中的任何錯誤時,才可以使用補...