暈死了。但是也長知識了
題意:乙個長度為n的序列:a[1]、a[2]、a[3]...a[n],然後給你一些約束條件:si、ni、gt||lt、ki表示:a[si]、a[si+1]、、、、a[si+ni]ki,問你滿足這些約束條件,字串是否存在。存在輸出:lamentable kingdom,否則輸出:successful conspiracy
題解:對序列求字首和,將約束條件改為:sum[si+ni]-sum[si-1]ki,為了方便:我們使其小標從1開始:sum[si+ni+1]-sum[si]ki;
但是:雖然我們可以根據上面的約束關係建立圖,但是並不能保證圖的聯通,也就是說我們不一定能找到負環,我們可以對所有的點在加入乙個相同的約束關係(這樣做並不會影響最終的約束關係,但但是增加了圖的連通性),新增約束關係的時候我們有兩種方案:
1、建立超級點,這個超級點1和任意乙個點的約束關係都一樣。
2、在用spfa求負環的時候,把所有的點加入佇列並把dis初始化為零,(相當於建立了乙個超級起點),然後判斷是否有點入隊的的次數大於n即可;
#include#include#include
using
namespace
std;
const
int maxn = 150
;int
n, m;
intu, v, d;
char s[15
];struct
edge
} e[maxn];
inthead[maxn], tot;
void
init()
void adde(int u, int v, int
len)
; head[u] = tot++;
}int
top, stk[maxn], num[maxn];
intdis[maxn], vis[maxn];
bool spfa(int st, int
n) }
}return
true;}
intmain ()
bool ans = spfa(1, n + 1
);
if(!ans) printf("
successful conspiracy\n");
else printf("
lamentable kingdom\n");
}return0;
}
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...