題目描述
由於外國間諜的大量滲入,****正處於高度的危機之中。如果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 如果控制了乙個塊,那麼這個塊後面所有的塊都能被控制 為了控制所有塊,一定要賄賂沒有入度的塊,因為它不能被其它塊控制到 ...