题意:对于一个软件有若干个bug和若干个补丁告诉你打每个补丁需要的状态和打完后的状态还有打每个补丁的费用,让你求把软件修好的最小费用。
思路:这道就是就是最短路然后再加上状态压缩存储,把+号与-号分开存在两个变量中,然后在Dijkstra执行的时候把补丁看成边,软件状态看成点就行了,别的都一样。
代码如下:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define ll long long10 #define eps 1E-811 #define INF 500000112 #define LEN 11113 14 using namespace std;15 16 typedef pair pii;17 int n, m, vis[1<<21]; 18 19 struct V{20 int val, bfix, bocr, efix, eocr;21 };22 23 V vex[LEN];24 25 struct S{26 int val, st;27 bool operator<(const S b) const28 { return val , greater > q;34 q.push(make_pair(0, (1<