BZOJ 2330 銀河 SCC 差分約束

2021-10-02 19:06:31 字數 2180 閱讀 7634

銀河中的恆星浩如煙海,但是我們只關注那些最亮的恆星。

我們用乙個正整數來表示恆星的亮度,數值越大則恆星就越亮,恆星的亮度最暗是 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 的亮度。

輸出格式

輸出乙個整數表示結果。

若無解,則輸出 -1。

資料範圍

n≤100000,m≤100000
輸入樣例:

5 7 

1 1 2

2 3 2

4 4 1

3 4 5

5 4 5

2 3 5

4 5 1

輸出樣例:

11
#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

1e5+

5, m =

6* n;

struct e e[m]

;int n, m, a, b, x, len, h[n]

, sh[n]

, top, num, id[n]

, scc_cnt, stack[n]

, dfn[n]

, low[n]

, scc[n]

, d[n]

;bool in_st[n]

, vis[n]

;void

add(

int h,

int u,

int v,

int w)

void

tarjan

(int u)

else

if(in_st[v]

) low[u]

=min

(low[u]

, dfn[v]);

}if(dfn[u]

== low[u]

)while

(u != v);}

}int

dfs(

int u)

return ans;

}int

main()

//建立超級源點

for(

int i =

1; i <= n; i++

)add

(h,0

, i,1)

;tarjan(0

);//判斷是否有強連通分量 邊權大於0

bool ok =

false

;for

(int i =

0; i <= n; i++)}

if(ok)

printf

("-1");

else

}//根據拓撲圖進行dp

for(

int u = scc_cnt; u >=

1; u--)}

ll ans =0;

for(

int i =

1; i <= scc_cnt; i++

) ans +

= d[i]

* scc[i]

;printf

("%lld"

, ans);}

return0;

}

BZOJ 2330 差分約束系統

差分約束系統是用最短路的三角不等式來得到題目中給定的不等式的一組解,具體來說,最短路中的不等式為if dis v dis u len p dis v dis u len p 假設題目中給定不等式a b 5,那麼轉換的不等式即為if dis a dis b 5 dis a dis b 5,這樣就把數學...

bzoj2330 差分約束 糖果

description 幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgw...

BZOJ 2330 差分約束系統

傳送門 差分約束這裡做個簡單介紹 形如 x i x j d 的不等式,可以聯想到我們求最短路時 d v d u len 則上式可以變形為 x i x j d 即連一條j i的長度為d的邊並跑最長路,dis i 則是滿足條件的最小解 因為上面等式採用的 號,所以求出的時最小解,同理當變形為 x j x...