P1262 间谍网络题解

P1262 间谍网络

题目描述

由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。

我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握了哪些间谍的资料。假设总共有 nnn 个间谍(nnn 不超过 300030003000),每个间谍分别用 111300030003000 的整数来标识。

请根据这份资料,判断我们是否有可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。

输入格式

第一行只有一个整数 nnn

第二行是整数 ppp。表示愿意被收买的人数,1≤p≤n1\le p\le n1pn

接下来的 ppp 行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。这个数额不超过 200002000020000

紧跟着一行只有一个整数 rrr1≤r≤80001\le r\le80001r8000。然后 rrr 行,每行两个正整数,表示数对 (A,B)(A, B)(A,B)AAA 间谍掌握 BBB 间谍的证据。

输出格式

如果可以控制所有间谍,第一行输出 YES,并在第二行输出所需要支付的贿金最小值。否则输出 NO,并在第二行输出不能控制的间谍中,编号最小的间谍编号。

输入输出样例 #1

输入 #1

3
2
1 10
2 100
2
1 3
2 3

输出 #1

YES
110

输入输出样例 #2

输入 #2

4
2
1 100
4 200
2
1 2
3 4

输出 #2

NO
3

思路

直接写题即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long a,b;
long long n,m,p,aa,bb,p2[200005],dfn[200005],low[200005],st[200005],sd[200005],n2=0,ss=0,s2[200005],df[200005],fd[200005],fd2[200005],db=0,bd=0,de[200005],as[200005];
long long bo[3005][3005],ded[200005];
vector<long long> v[200005];
inline void abc(long long a1){
    low[a1]=dfn[a1]=++n2;
    st[++st[200004]]=a1;
    de[a1]=1;
    //cout<<st[200004]<<" "<<st[st[200004]]<<endl;
    for(int i=0;i<v[a1].size();i++){
        long long tt=v[a1][i];
        if(de[tt]==1){
            low[a1]=min(low[a1],dfn[tt]);
        }
        else if(de[tt]==0){
            abc(tt);
            low[a1]=min(low[a1],low[tt]);
        }
    }
    if(low[a1]==dfn[a1]){
        ss++;
        s2[a1]=ss;
        df[ss]=1;
        sd[ss]=p2[a1];
        as[ss]=a1;
        while(st[st[200004]]!=a1){
            //cout<<st[200004]<<" "<<st[st[200004]]<<endl;
            s2[st[st[200004]]]=ss;
            de[st[st[200004]]]=-1;
            sd[ss]=min(sd[ss],p2[st[st[200004]]]);
            as[ss]=min(as[ss],st[st[200004]]);
            st[200004]--;
            df[ss]++;
        }
        //cout<<st[200004]<<" "<<st[st[200004]]<<" "<<a1<<endl;
        de[st[st[200004]]]=-1;
        st[200004]--;
    }
    //cout<<a1<<" "<<v[a1].size()<<" "<<st[200004]<<endl;
    return ;
}
int main(){
	cin>>n>>p;
    for(int i=1;i<=n;i++){
        p2[i]=1e9+7;
    }
    for(int i=1,j;i<=p;i++){
        cin>>j;
        cin>>p2[j];
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>aa>>bb;
        v[aa].push_back(bb);
    }
    for(int i=1;i<=n;i++){
        if(dfn[i]==0){
            //cout<<"ddddddddddddddddddddddddddd"<<i<<endl;
            abc(i);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<v[i].size();j++){
            if(s2[i]!=s2[v[i][j]]){
                if(s2[i]==0){
                    //cout<<i<<endl;
                    //cout<<st[200004]<<endl;
                }
                if(bo[s2[v[i][j]]][s2[i]]==0){
                    bo[s2[v[i][j]]][s2[i]]=1;
                    ded[s2[v[i][j]]]++;
                }
                fd[s2[v[i][j]]]++;
                fd2[s2[i]]++;
            }
        }
    }
    db=1e18+7;
    for(int i=1;i<=ss;i++){
        if(fd[i]==0){
            if(sd[i]<=1e8){
                bd+=sd[i];
            }
            else{
                bd=1e18+7;
                db=min(db,as[i]);
                for(int j=1;j<=ss;j++){
                    if(bo[j][i]==1){
                        ded[j]--;
                    }
                }
            }
            //bd++;
        }
        if(fd2[i]==0){
            db++;
        }
    }
    if(bd<=1e16){
        cout<<"YES"<<endl<<bd<<endl;
    }
    else{
        for(int i=1;i<=ss;i++){
            if(ded[i]<=0&&sd[i]>=1e8+1){
                db=min(db,as[i]);
                //cout<<as[i]<<endl;
            }
        }
        cout<<"NO"<<endl<<db<<endl;
    }
    return 0;
}
posted @ 2025-10-28 17:30  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源