P3275 SCOI2011 糖果 題解

2022-05-06 21:21:09 字數 2426 閱讀 7349

一道差分約束的模板題。

題目題意:n個人每個人至少乙個糖果,另外要滿足k個不等式,求最少糖果數。

差分約束系統

給定一組不等式 $ x[i]-x[j]<=c[k] $ (或 $ x[i]-x[j]>=c[k] $ ),需要求出滿足所有不等式的一組解 $ (x[1],x[2],…,x[n]) $ 。這類問題是線性規劃的一類簡單問題。

形式:通常表示為 $ ax<=c(或ax>=c) $ ,其中係數矩陣 $ a $ 的每一行裡有乙個 $ 1 $ 和乙個 $ -1 $ ,其餘元素都為 $ 0 $。若 $ a $ 為 $ m* n $的矩陣,則 $ x $ 為 $ n* 1 $ 的矩陣,$ c $ 為 $ m* 1 $ 的矩陣,對應有 $ m $ 個不等式,$ n $ 個未知數,即該系統為乙個有 $ n $ 個未知數、$ m $ 個約束條件的系統,這就是差分約束系統。

求解差分約束系統,可以轉化成圖論的單源最短路徑問題

$ x[j]-x[i]<=b[k] $ ,類似最短路中的三角不等式 $ d[j] <= d[i] + w[i,j] $ ,即 $ d[j] - d[i] <= w[i,j] $

以每個變數 $ x[i] $ 為結點,對於約束條件 $ x[j]-x[i]<=b[k] $ ,連線一條邊 $ e(i,j) $ ,邊權為 $ b[k] $

增加乙個源點s與所有其他點相連,邊權均為 $ 0 $ , $ x[i]-x[0]<=0 $

則引例中的不等式可以轉化為如下有向圖:

最短路和最長路的區分

若求最大的解,那麼初始時把 $ d $ 設為無窮大,用最短路求解。即 $ if(d[v]>d[u]+w(u,v)) $ 進行更新,而建圖的時候也要用小於等於。

若求最小的解,那麼初始時把 $ d $ 設為無窮小,用最長路求解。即 if $ (d[v]以求解最大的為例(最小解同理)$ d[s] $ 一開始為無窮大,圖最短路更新的條件為: $ if(d[v]>d[u]+w(u,v))d[v]=d[u]+w(u,v) $ ; 通過不斷的鬆弛,使得d的值不斷變小,直到滿足所有條件,也就是說滿足條件的時候就是最大的了。

那麼這題我們可以分情況討論

1.當 $ x=1 $ 建邊 $ w[i,j]=0 \ w[j,i]=0 $

2.當 $ x=2 $ 建邊 $ w[i,j]=1( $ 如果 $ i=j $ 輸出 $ -1 $

3.當 $ x=3 $ 建邊 $ w[j,i]=0 $ 可以取等就取等

4.當 $ x=4 $ 建邊 $ w[j,i]=1( $ 如果 $ i=j $ 輸出 $ -1 $

5.當 $ x=5 $ 建邊 $ w[i,j]=0 $ 可以取等就取等

最後從 $ 0 $ 號節點向各個節點連一條長度為 $ 1 $ 的邊(至少乙個糖果,跑spfa最長路即可。

對於環特判,spfa乙個點進入佇列的次數大於等於n次,則說明存在環

最後統計每個點的糖果數即可

注意$ ans $ 開 $ long \ long $ 十年 $ oi $ 一場空,不開$ long \ long $見祖宗

從 $ 0 $ 號節點建圖倒過來列舉(出題人卡 $ spfa $ 喪心病狂, $ spfa $ 的效率與建圖有關所以反過來就起飛

**

#includeusing namespace std;

const int size=200010;

int tot,head[size],ver[size*2],next[2*size],edge[2*size];

int v[size],d[size],to[size],n,k;

bool flag=1;

long long ans;

queueq;

void add(int x,int y,int z)

void spfa()to[x]++;

for(int i=head[x];i;i=next[i])

} }}int main()else if(x==2)else if(x==3)else if(x==4)else

if(!flag)

} for(int i=n;i;--i) add(0,i,1);

spfa();

for(int i=1;i<=n;++i) ans+=d[i];

printf("%lld",ans);

return 0;

}

題解 洛谷P3275 SCOI2011 糖果

一道條件非常多的差分約束 把 a b 轉化為 a b le 1 就可做了 a b 的情況同理 若有負環則無解輸出 1 注意本題中要求每個人都有糖果 所以假設乙個源點 d 使 d d ge 1 1 le i le n 另外,本題要求得是最小值 x x le a 的形式求出的是最大值 要轉化成 x x ...

題解 洛谷P3275 SCOI2011 糖果

題面 其實是裸的差分約束吧 qwq。對於每一種情況分類討論一下 這裡說一下差分約束最基本的建圖方式 如何求最值呢?結論 如果求的是最小值,那麼我們就跑一遍最長路 否則就跑一遍最短路。具體的方法就是對於每乙個 x i geq c 的條件,建立乙個超級源點 0 由 0 向 x i 連一條長度為 c 的邊...

SCOI2011 糖果 題解

洛谷題面 看到很多題解並沒有講清楚這道題為什麼可以用某些方法,套個板子就沒了。蒟蒻就發一篇題解裝x造福大家吧233 做這道題前,我推薦大家做一下一本通中的1352 例4 13 獎金一題,因為有可能做完了這道題對於你們會有一點啟發。題目分析題目對於小朋友的嫉妒一共有 5 中情況,分別如下 如果 x 1...