題意:
給了由n個數組成的乙個數列,然後給你各種區間的和是大於ci還是小於ci啥的,最後問你是否衝突。
思路:差分約束水題,不過wa了兩次,原因處理區間問題的細節馬虎了,說下建圖吧,這個題目給的是大於或者小於,不是大於等於啥的,其實這個好辦,直接進行相應的+-1就能新增等於號了,然後進行關係轉換
假如輸入的是 a b str c
b = a + b + 1 //一開始忘記了區間的這個處理方法忘記+1
那麼if(str[0] == g)
b - a > c
b - a >= c + 1
直接建邊 add(a ,b ,c + 1);
else
b - a < c
b - a <= c - 1
a - b >= -(c-1)
add(b ,a ,-(c-1));
上面的建圖是跑最上路的,也可以不這麼建圖,就是全部都反過來,然後跑最短路,還有就是差分約束很多題目需要我們補充連通性,就是虛擬出來乙個0,連線所有點,距離是0,這樣是為了防止真個圖不連通,當然,如果你想mark然後for去多次最短路也行,這個題目還有乙個地方,就是b=a+b+1中的+1可能會導致n+1,所以記得n++後在跑最短路,別的沒啥題目不難,不涉及到隱含條件。
#include#include#include#define n_node 100 + 10
#define n_edge 100 + 20
#define inf 1000000000
using namespace std;
typedef struct
star;
star e[n_edge];
int list[n_node] ,tot;
int s_x[n_node] ,mark[n_node] ,mkc[n_node];
void add(int a ,int b ,int c)
bool spfa(int s ,int n)}}
}return 1;
}int main ()
n++;
for(i = 1 ;i <= n ;i ++)
add(0 ,i ,0);
if(!spfa(0 ,n)) printf("successful conspiracy\n");
else printf("lamentable kingdom\n");
}return 0;
}
POJ 1364 差分約束
解題的思路比較奇葩。第一次見到啊,也不知道別人是怎麼看出來這種情況下就是差分約束也就是可以用到圖論,表示真的好迷啊。看來對差分約束的概念還很差呢。include include include include includeusing namespace std const int maxn 100...
POJ 1364 差分約束
思路 把所有 變成 把所有 加一減一就好了 然後我們發現 圖不一定連通!怎麼辦呢 對於每乙個連通塊spfa就好了嘛 by siriusren include include include include define n 111 using namespace std char a 3 inq n...
POJ 1364 差分約束
題意 給出乙個數字序列 s 它有 m 個子序列 si 現在給出 m 個限制條件 第 i 個子序列的和 ki 或 第 i 個子序列的和 ki 思路 標準的差分約束,用s is i si 表示a1 a2.ai a 1 a 2.a i a1 a2 ai 的值,並且s0 0s 0 0 s0 0,所有s is...