P1262 間諜網路

2022-05-20 02:07:38 字數 1664 閱讀 1007

傳送門

顯然可以把所有間諜的關係建乙個圖

如果a間諜手中掌握著關於b間諜的犯罪證據,那就從a連一條邊到b

如果賄賂了乙個間諜,那麼整個聯通塊的間諜肯定都被控制

那就先把圖縮成dag

如果控制了乙個塊,那麼這個塊後面所有的塊都能被控制

為了控制所有塊,一定要賄賂沒有入度的塊,因為它不能被其它塊控制到

那就tarjan然後賄賂所有入度為0的塊,答案就是總花費

要注意判斷是否能控制所有塊

如果乙個塊不能被賄賂,並且沒有塊可以控制它,那麼它就不能被控制

那麼我們縮點的時候可以只從能被賄賂的間諜開始縮

全部縮完後如果有間諜不處於任何聯通塊,那麼ta就不能被控制

for一遍就好了

至於控制乙個塊的花費就是最便宜的那個間諜,tarjan時可以一起處理

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='9'

)

return x*f;

}const

int n=3007,m=2e5+7

;int

n,m,t;

intval[n];

int fir[n],from

[m],to[m],cnt;

inline

void add(int &a,int &b)

//tarjan模板

int dfn[n],low[n],be[n],st[m],cnt2,_top,dfn_clock,miv[n];//

miv[i]是塊i的最小費用

void tarjan(int

x)

if(low[x]==dfn[x])

miv[cnt2]=min(miv[cnt2],val[st[_top]]);

be[st[_top--]]=cnt2;

}}int

du[n];

intmain()

cin>>t;

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

for(int i=1;i<=n;i++) if(!dfn[i]&&val[i]!=val[0]) tarjan(i);//

只從能被賄賂的間諜開始縮點

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

if(!be[i])

printf(

"yes\n");

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

for(int j=fir[i];j;j=from

[j])

if(be[i]!=be[to[j]]) du[be[to[j]]]++;//

算一波入度

int ans=0

;

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

if(!du[i]) ans+=miv[i];//

所有入度為0的塊都要賄賂

printf("%d"

,ans);

return0;

}

洛谷 P1262 間諜網路

題目描述 由於外國間諜的大量滲入,正處於高度的危機之中。如果a間諜手中掌握著關於b間諜的犯罪證據,則稱a可以揭發b。有些間諜收 賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了乙個間諜,他手中掌握...

洛谷 P1262 間諜網路

題目描述 由於外國間諜的大量滲入,正處於高度的危機之中。如果a間諜手中掌握著關於b間諜的犯罪證據,則稱a可以揭發b。有些間諜收 賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了乙個間諜,他手中掌握...

洛谷P1262 間諜網路

給定n個點 其中p個點可以被賄賂,被賄賂的金額為x,如果乙個點被賄賂,他所指向的點也會被賄賂 求 如果不能全部被賄賂 輸出no以及不能被賄賂的點 否則輸出yes和需要支付的金額的最小值 我們可以通過tarjan縮點,最後掃一遍dfn,若果有乙個點並沒有被訪問過,說明這個點肯定不會被賄賂 直接輸出並結...