uva658 dijkstra 狀態壓縮

2022-08-13 10:54:23 字數 1090 閱讀 2836

題目大意:

假定有n個潛在的bug和m個補丁,每個補丁用長為n的字串表示。首先輸入bug數目以及補丁數目。然後就是對m 個補丁的描述,共有m行。每行首先是乙個整數,表明打該補丁所需要的時間。然後是兩個字串,地乙個字串 是對軟體的描述,只有軟體處於該狀態下才能打該補丁該字串的每乙個位置代表bug狀態(-代表該位置沒bug,+代 錶該位置有bug,0表示該位置無論有沒有bug都可打補丁)。然後第二個字串是對打上補丁後軟體狀態的描述 -代表該位置上的bug已經被修復,+表示該位置又引入了乙個新的bug, 0表示該位置跟原來狀態一樣)。要求用最少 時間完成對軟體的修復,即將所有位置全都置為0.

基本思路:

狀態壓縮一下轉化為最短路來處理

**如下:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const int maxn = 1000000000+10;

int n,m,t[110],d[1<<20],vis[1<<20];

char before[110][25],after[110][25];

struct node

};int dijkstra()

if(before[i][j]=='+'&&!(x.bug&(1<}

if(!pat) continue;

node next;

next.bug=x.bug;

next.dist=x.dist+t[i];

for(int j=0;jint &d=d[next.bug];

if(next.dist}

}return -1;

}int main()

int ans=dijkstra();

printf("product %d\n",++cas);

if(ans<0)else

}return 0;

}

UVA 11825 狀壓 子集列舉

題意 給你若干個集合,讓你把這些集合做劃分使的每個劃分的並集是乙個全集,問你最多能進行多少個劃分。思路 首先了解下子集列舉的方法 for int i s i i i 1 i 1使得末尾最右邊的1右邊的0變成1,自己變成0,然後經過與運算把不存在的1刪掉,原來是0的位無論如何也不會變成1,但是原來是1...

UVa 10817 狀壓 記憶化搜尋

描述 m個教師,n個求職者,s門課程.每門課程至少需要2個老師教,問符合要求的最小值 分析 首先定義狀態 對於每乙個老師只有教或者不叫兩種決策,而方程想要轉移,很容易看出需要知道此時老師教授的情況.故 定義 f i s1 s2 i表示依考慮到前i個老師 s1為乙個老師教的集合 s2為兩個老師教的集合...

3 6 環狀序列(UVa1584)

長度為n的環狀串有n種表示法,分別為某個位置開始順時針得到。例如,圖中的環狀串有10種表示 cgagtcagct,gagtcagctc,agtcagctcg等。在這些表示法中,字典序最小的稱為 最小表示 輸入乙個長度為n n 100 的環狀dna串 只包含a c g t這4種字元 的一種表示法,你的...