傳送門
顯然可以把所有間諜的關係建乙個圖
如果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,若果有乙個點並沒有被訪問過,說明這個點肯定不會被賄賂 直接輸出並結...