差分約束 最短路 經典例題 love

2021-07-06 01:45:48 字數 2478 閱讀 7239

【題目描述】

吶,貴樹真的是乙個很帥的男孩子呢,所以好多女孩都給他寫至少一封

了情書。那每個女孩給了貴樹寫了多少情書呢?我們不知道,但是我們知

道一些女孩子寫情書數量的關係,你的任務是推斷出貴樹最少受到了多少

情書。【輸入檔案】

輸入的第一行為兩個整數 n,k,表示一共 n 個女孩,知道 k 對關係

接下來 k 行,每行三個整數 t,a,b

如果 t=1,則表示 a 的情書和 b 的情書數量一樣

如果 t=2,則表示 a 的情書少於 b 的情書數量

如果 t=3,則表示 a 的情書不少於 b 的情書數量

如果 t=4,則表示 a 的情書多於 b 的情書數量

如果 t=5,則表示 a 的情書不多於 b 的情書數量

【輸出檔案】

一行,表示貴樹滿足這些關係時最少情況下收到情書的數量。

如果這些關係不可能同時被滿足,則輸出 -1。

【樣例輸入】

5 71 1 2

2 3 2

4 4 1

3 4 5

5 4 5

2 3 5

4 5 1

【樣例輸出】

11【資料規模】

對於 30% 資料,保證 n <=100

對於 100% 資料,保證 n <=100000

看完這道題的感受就是「意~」,多麼瑪麗蘇的題目orz,這道題乃某神犇看完秒速五厘公尺後有感而作(ヾ(。`д´。)題意和題目完全沒有關係好嗎woc)

最開始用的方法只過了20分= =,後面的要麼wa,要麼超時,特將錯誤**貼出留作紀念= =

#include#include#includeusing namespace std;

const int inf=0x7f7f7f;

struct node

e[400005];

int t,a,b;

int n,k;

int f[100005];//i個女生最少會給的數量

int num[100005];//每個女生最少會給的數量

bool flag=false;

int main()

for(int i=1;i<=k;i++)

for(int i=1;i<=k;i++)//不能滿足flag=true

if((e[i].cmp==2&&e[j].cmp==3)||(e[i].cmp==4&&e[j].cmp==5))//2,3不能同時滿足

}}

} if(flag==false)

} /*for(int i=1;i<=n;i++)

*/ f[0]=0;

for(int i=1;i<=n;i++)

printf("%d",f[n]);

return 0;

}

其實通過觀察我們可以發現比如三個不等式

,b-a<=k1,c-b<=k2,c-a<=k3,求出c-a的最大值,我們可以把a,b,c轉換成三個點,k1,k2,k3是邊上的權

所以題目就可以通過比較k1+k2和k3大小,求出的就是c-a的最大值了。

所以求解過程實際就是求從a到c的最短路徑。

現在回到這道題上,就需要把不等式轉化為x-y>=z的形式,尋找最長路

#include#include#includeusing namespace std;

int n,k;

struct node

e[400005];

int head[100005];

int m=0;

int queue[100005];

int qhead=0;

int tail=1;

int dis[100005];//記錄增加的情書數量

bool v[100005];

int bb[100005];// 記錄入隊次數

bool flag;

void add(int u,int v,int w)//加邊

void read()

for(int i=1;i<=k;i++)

if(t==3) add(b,a,0);//分類對5種情況進行賦值,當a>=b||a<=b時,因為求最小所以去=的情況,邊的權值賦為0

if(t==5) add(b,a,0);

if(t==2) add(a,b,1);//當a>b||b>a時,邊的權值賦為1

if(t==4) add(b,a,1);

}}void spfa()}}

p1=e[p1].next;}}

int ans=n;//因為每個人至少送1封,所以ans初值為n

if(flag==false)

printf("%d ",ans);

}}int main()

K Candies 差分約束 最短路)

有n個孩子,m個關係 關係分別有3個數u,v,w。代表v的糖果數不能多於u w個,也就是dis v dis u w 這就轉換成 if dis v dis u w dis v dis u w.1 spfa stack include include include include includecon...

2018 08 07 最短路徑 差分約束

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表示成都的大...

差分約束系統 變相的最短路

之前沒有細看,想不明白這個問題怎麼和最短路扯上關係,細細看了看,也沒明白,原因是在看dijk演算法的時候就沒好搞明白它的 實現,以至於這個問題模擬到最短路實現的時候一臉懵,還去瞅了瞅三角不等式是什麼東西,簡單來說,難就難在圖的構造上面,構造好圖之後就是模板,就是之前的內容了,一起看看這個東西吧,on...