題目很簡單,用差分約束系統解決。假設si=z與結合[1,i)的交集的元素的個數,則依題意有s[b+1]-s[a]>=c,還有隱含條件s[i+1]-s[i]>=0 && s[i]-s[i+1]>=-1。然後求最短路徑或最長路徑,用bellman-ford演算法解會超時,於是用spfa演算法解,288ms,還算快。
可以通過spfa演算法求最短路,也可以通過spfa演算法求最長路解這題,時間消耗上差不多一樣的。為什麼可以求最長路了?
記住一句話:求最小值,>=,求最長路;求最大值,<=,求最短路。為什麼可以上網查詢,只要理解了差分約束系統和spfa演算法就很容易理解。
//求最短路徑
#include #include #include #define inf 100000000
using namespace std;
const int maxn=50010;
int num,m,head[maxn],dist[maxn],queue[50*maxn];
bool visit[maxn];
struct edge
edge[6*maxn];
void addedge(int s,int t,int w)
void spfa()
edge[6*maxn];
void addedge(int s,int t,int w)
void spfa()
{ int i,u,v,id,first,last;
first=0;
last=0;
queue[last++]=0; //源結點設為0
dist[0]=0;
visit[0]=true;
while(first!=last)
{u=queue[first++];
id=head[u];
visit[u]=false;
while(id!=-1)
{v=edge[id].t;
if(dist[v]
POJ 1201 差分約束系統
差分約束系統其實就是將不等式組的求解問題轉化為最短路進行求解,所以屬於圖論。但往往抽象出不等式組是不容易的。差分約束系統入門可看這位大佬的博文 夜深人靜寫演算法 四 本題大意 n個區間,輸入n行ai,bi,ci,代表在區間 ai,bi 上至少要選擇ci個整數點,可以在區間內任意取ci個不重複的點。求...
差分約束系統(poj 1201)
1 內容 是解決多個一元n次不等式組 包含n個變數x1 xn 和m個約束條件,沒個約束條件都是由兩個變數的差值決定的 eg xi xj ck 求一組解x1 a,x2 a2 xn an 2 求解思路 將不等式xi xj ck視為鬆弛操作,dis y dis x ci 進而將問題轉化為兩個點之間的距離的...
POJ 1201(差分約束系統)
poj 1201 1 題意 給出n個區間 ai,bi 要求區間內最少選出ci個整數,求出乙個集合z,滿足n個區間的要求,輸出集合z的最小大小。2 思路 滿足最小要求的差分約束系統,需要求出最長路徑,每個區間都能滿足要求。所以將所有的不等式轉化為ai bi 1 ci的形式,還有乙個隱含條件 0 di ...