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...