洛谷 P1262 間諜網路

2021-07-24 09:00:56 字數 1893 閱讀 8704

題目描述

由於外國間諜的大量滲入,****正處於高度的危機之中。如果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

【分析】

tarjan求強連通分量

重新建圖

找出入度為0的且能被收買的點累加進答案

同乙個縮點中找出最小收買**加入答案

【**】

//間諜網路(age) 

#include

#include

#include

#include

#include

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

const

int mxn=8005;

stack

s;vector

f[mxn];

struct buy a[mxn];

struct edg e[mxn];

int n,p,r,tim,num,ans,ha;

int dfn[mxn],low[mxn],be[mxn],du[mxn],cost[mxn];

bool vis[mxn],in[mxn];

inline

void tarjan(int u)

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

while(u!=v);

}}inline

void dfs(int u)

}int main()

fo(i,1,p) if(!vis[be[a[i].who]]) dfs(be[a[i].who]);

fo(i,1,num) if(!vis[i])

if(mn!=1e9)

memset(vis,0,sizeof vis);

fo(i,1,p)

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 如果控制了乙個塊,那麼這個塊後面所有的塊都能被控制 為了控制所有塊,一定要賄賂沒有入度的塊,因為它不能被其它塊控制到 ...