P2294 HNOI2005 狡猾的商人

2022-03-04 05:57:40 字數 2251 閱讀 6532

輸入格式:

從檔案input.txt中讀入資料,檔案第一行為乙個正整數w,其中w < 100,表示有w組資料,即w個賬本,需要你判斷。每組資料的第一行為兩個正整數n和m,其中n < 100,m < 1000,分別表示對應的賬本記錄了多少個月的收入情況以及偷看了多少次賬本。接下來的m行表示刁奼偷看m次賬本後記住的m條資訊,每條資訊佔一行,有三個整數s,t和v,表示從第s個月到第t個月(包含第t個月)的總收入為v,這裡假設s總是小於等於t。

輸出格式:

輸出檔案output.txt中包含w行,每行是true或false,其中第i行為true當且僅當第i組資料,即第i個賬本不是假的;第i行為false當且僅當第i組資料,即第i個賬本是假的。

輸入樣例#1: 

2

3 31 2 10

1 3 -5

3 3 -15

5 31 5 100

3 5 50

1 2 51

輸出樣例#1: 

true

false

solution:本題是思維比較巧妙的差分約束。。。

思路類似於植樹那道題,$u\rightarrow v=c$可以理解為$sum[v]-sum[u-1]=c$(字首和)。

那麼對於每個條件我們可以先得出約束條件:$w[u-1,v]=c$表示$sum[v]$比$sum[u-1]$大$c$。

我們直接在這樣的圖上跑最長路後能求出每個點的$dis$值,但是如何去判斷是否合法呢?

先看這張圖(手繪勿噴):

此圖表示的是$sum[1,3]=1,\;sum[1,2]=1,\;sum[2,3]=1$的情況,顯然是不合法的情況,但是我們求出最長路後的$dis$值分別為$dis[1]=0,\;dis[2]=1\;dis[3]=2$,貌似對判斷合法沒什麼用。

不難發現,用少了約束條件,給定的$sum[u\rightarrow v]=c$不僅需要滿足$sum[v]-sum[u-1]=c$,還應該滿足$sum[u-1]-sum[v]=-c$。

那麼我們加入這一約束後,圖就變成了這樣:

此時,我們由第一張圖求得的$dis[1]=0,\;dis[2]=1,\;dis[3]=2$在此圖中還可以繼續更新,$dis[1]=0$會由$dis[3]$更新變為$dis[1]=1$,然後引發一系列無限制的更新。究其原因,就是因為不滿足$sum[u-1]-sum[v]=-c$這一約束條件。

所以我們將兩個約束條件都建成邊。

再考慮另乙個問題,那就是源點不確定,所以我們每次以沒有被遍歷過的點為源點跑$spfa$求最長路(即使約束條件中沒有出現過該點也對答案無影響,因為根本不會由它進行廣搜遍歷),那麼當某個點被重複遍歷超過$n$次,則出現了環,說明不可行,否則就是合法的。(事實證明資料比較水,因為我第一遍沒有考慮源點不為$0$的情況,但是卻$a$了~~)

**:

#include#define il inline

#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

using

namespace

std;

const

int n=5005,inf=23333333

;int

t,to[n],tot[n],net[n],h[n],w[n],dis[n],cnt,n,m;

bool

vis[n];

queue

q;il int

gi()

il void add(int u,int v,int c)

il bool spfa(int

s) }

return1;

}int

main()

f=0; for(i,

0,n-1

) }

}if(!f)printf("

true\n");

else printf("

false\n");

}return0;

}

洛谷P2294 HNOI2005 狡猾的商人

輸入格式 從檔案input.txt中讀入資料,檔案第一行為乙個正整數w,其中w 100,表示有w組資料,即w個賬本,需要你判斷。每組資料的第一行為兩個正整數n和m,其中n 100,m 1000,分別表示對應的賬本記錄了多少個月的收入情況以及偷看了多少次賬本。接下來的m行表示刁奼偷看m次賬本後記住的m...

洛谷P2294 HNOI2005 狡猾的商人

一道差分約束.但是我橫看豎看,只從字縫裡看到了 並查集 三個大字.很明顯嘛,什麼判斷真假,什麼字首和關係傳遞,不是明擺著的帶權並查集嗎?include include include include using namespace std const int maxn 1e2 10 const in...

HNOI2005 狡猾的商人

刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3 n 1,n 當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai 元。所謂一段時間內的總收入,就是這段時間內每個月的收入額的總和...