銀河 lduoj 差分約束

2021-10-22 11:52:25 字數 1695 閱讀 9057

hint

銀河中的恆星浩如煙海,但是我們只關注那些最亮的恆星。我們用乙個正整數來表示恆星的亮度,數值越大則恆星就越亮,恆星的亮度最暗是 1。現在對於 n 顆我們關注的恆星,有 m 對亮度之間的相對關係已經判明。你的任務就是求出這 n 顆恆星的亮度值總和至少有多大。

第一行給出兩個整數n和m。

之後m行,每行三個整數t,a,b,表示一對恆星(a,b)之間的亮度關係。恆星的編號從1開始。

如果t=1,說明a和b亮度相等。

如果t=2,說明a的亮度小於b的亮度。

如果t=3,說明a的亮度不小於b的亮度。

如果t=4,說明a的亮度大於b的亮度。

如果t=5,說明a的亮度不大於b的亮度。

輸出乙個整數表示答案。

571

1223

2441

3455

4523

5451

11
對於30%的資料,n≤100。

對於100%的資料,n≤100000,m≤100000。

這個題可以用tarjan縮點來進行處理

從題意的制約關係來看,也可以當作差分約束來處理

當用差分約束的時候,通過題意,我們可以了解到:題目要求我們求出n顆恆星亮度的最小值,那麼我們就要求出這n個點亮度之和的最長路

然後就是普通的spfa處理,注意在跑spfa的時候,我們要判斷是否存在乙個正環,如果說存在乙個正環,我們要直接輸出-1,因為這個時候他的亮度值會不斷的加大:舉個例子(1 > 2, 2 > 3, 3 > 4,4 > 1),這個時候我們就要像用spfa判斷是否存在負環的方式來進行判斷是否存在正環,在處理的過程中,我們可以記錄每個點進入佇列的次數,如果說進入佇列的次數大於n,說明就會有正環,但是這裡其實還會有一種小的優化,如果使用queue的話,會被卡tle,但是如果是用stack就能通過這個題,其實,棧優化的spfa在不存在負環的時候,會比佇列優化的spfa更快一些

const

int maxn =

1e6+7;

int n, m;

ll dis[maxn]

;bool vis[maxn]

;struct node

e[maxn]

;int cnt, head[maxn]

;int tot[maxn]

;void

init()

}void

add(

int u,

int v,

int w)

int flag =1;

void

spfa()

if(vis[to]==0

)}}if

(flag ==0)

break;}

}int

main()

for(

int i =

1; i <= n; i++

)add(0

, i,1)

;///超級源點

spfa()

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

*/if(flag)

cout << res <<

'\n'

;return0;

}puts

("-1");

return0;

}/**

**/

AcWing368 銀河(差分約束)

本題資料量比較大,可以用tarjan縮點後判環,我使用的是差分約束,如果存在環的情況,最好將佇列換成棧。但是在普通求spfa的時候,還是要用佇列。includeusing namespace std const int n 3e5 10 int h n ne n e n w n idx void a...

BZOJ 2330 銀河 SCC 差分約束

銀河中的恆星浩如煙海,但是我們只關注那些最亮的恆星。我們用乙個正整數來表示恆星的亮度,數值越大則恆星就越亮,恆星的亮度最暗是 1。現在對於 n 顆我們關注的恆星,有 m 對亮度之間的相對關係已經判明。你的任務就是求出這 n 顆恆星的亮度值總和至少有多大。輸入格式 第一行給出兩個整數 n 和 m。之後...

POJ3169差分約束 SPFA 差分約束

思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...