題目描述
由於外國間諜的大量滲入,****正處於高度的危機之中。如果a間諜手中掌握著關於b間諜的犯罪證據,則稱a可以揭發b。有些間諜收**賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了乙個間諜,他手中掌握的情報都將歸我們所有,這樣就有可能逮捕新的間諜,掌握新的情報。
我們的反間諜機關提供了乙份資料,色括所有已知的**的間諜,以及他們願意收受的具體數額。同時我們還知道哪些間諜手中具體掌握了哪些間諜的資料。假設總共有n個間諜(n不超過3000),每個間諜分別用1到3000的整數來標識。
請根據這份資料,判斷我們是否有可能控制全部的間諜,如果可以,求出我們所需要支付的最少資金。否則,輸出不能被控制的乙個間諜。
輸入輸出格式
輸入格式:
第一行只有乙個整數n。
第二行是整數p。表示願意被收買的人數,1≤p≤n。
接下來的p行,每行有兩個整數,第乙個數是乙個願意被收買的間諜的編號,第二個數表示他將會被收買的數額。這個數額不超過20000。
緊跟著一行只有乙個整數r,1≤r≤8000。然後r行,每行兩個正整數,表示數對(a, b),a間諜掌握b間諜的證據。
輸出格式:
如果可以控制所有間諜,第一行輸出yes,並在第二行輸出所需要支付的賄金最小值。否則輸出no,並在第二行輸出不能控制的間諜中,編號最小的間諜編號。
輸入輸出樣例
輸入樣例#1:
【樣例1】
3 2
1 10
2 100
2 1 3
2 3
【樣例2】
4 2
1 100
4 200
2 1 2
3 4輸出樣例#1:
【樣例1】
yes
110
【樣例2】
no 3
先對每乙個願意**的間諜dfs,判斷是否可以控制全部間諜。
若可以,用tarjan找環,縮點,入度為零的點的費用之和就是最小費用。
#include
#include
#include
#include
#include
using
namespace
std;
struct spy
a[3001];
vector
v[3001];
stack
stk;
int n,p,r,ans,dcnt,tim,dfn[3001],low[3001],belong[3001],cst[3001],x[8001],y[8001];
bool b[3001],instack[3001],***[3001];
void dfs(int u)
void tarjan(int u)
else
if(instack[j])
low[u]=min(low[u],dfn[j]);
}if(dfn[u]==low[u])
}}int main()
for(int i=1;i<=p;++i)
dfs(a[i].num);
for(int i=1;i<=n;++i)
if(!b[i])
for(int i=1;i<=n;i++)
if(dfn[i]==0)
tarjan(i);
memset(cst,0x7f,sizeof(cst));
for(int i=1;i<=p;++i)
cst[belong[a[i].num]]=min(cst[belong[a[i].num]],a[i].w);
for(int i=1;i<=r;++i)
if(belong[x[i]]!=belong[y[i]])
***[belong[y[i]]]=1;
for(int i=1;i<=dcnt;i++)
if(!***[i])
ans+=cst[i];
printf("yes\n%d\n",ans);
return
0;}
洛谷 P1262 間諜網路
題目描述 由於外國間諜的大量滲入,正處於高度的危機之中。如果a間諜手中掌握著關於b間諜的犯罪證據,則稱a可以揭發b。有些間諜收 賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了乙個間諜,他手中掌握...
洛谷P1262 間諜網路
給定n個點 其中p個點可以被賄賂,被賄賂的金額為x,如果乙個點被賄賂,他所指向的點也會被賄賂 求 如果不能全部被賄賂 輸出no以及不能被賄賂的點 否則輸出yes和需要支付的金額的最小值 我們可以通過tarjan縮點,最後掃一遍dfn,若果有乙個點並沒有被訪問過,說明這個點肯定不會被賄賂 直接輸出並結...
P1262 間諜網路
傳送門 顯然可以把所有間諜的關係建乙個圖 如果a間諜手中掌握著關於b間諜的犯罪證據,那就從a連一條邊到b 如果賄賂了乙個間諜,那麼整個聯通塊的間諜肯定都被控制 那就先把圖縮成dag 如果控制了乙個塊,那麼這個塊後面所有的塊都能被控制 為了控制所有塊,一定要賄賂沒有入度的塊,因為它不能被其它塊控制到 ...