P1262间谍网络

来源:互联网 发布:软件补丁怎么用 编辑:程序博客网 时间:2024/05/01 11:44

题目描述

由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果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 的蒟蒻我好慌2333首先你可以跑一遍bfs,如果有不能抵(zhua)达(zhu)的间谍,输出no。然后tarjan缩点,则到每个点的数目就是你要的花费。(我懒所以没有跑bfs)
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<stack>using namespace std;const int INF=23333333;const int maxn=233333;int head[maxn],nxt[maxn],to[maxn];int ff[maxn],tt[maxn];int scc[maxn],low[maxn],dfn[maxn],rd[maxn],xh[maxn];int cost[maxn],minc[maxn];int cnt=0,dfs_clock=0,ans=0;int tot;int n,p;int r;stack<int>s;void addedge(int f,int t){    to[++tot]=t;    nxt[tot]=head[f];    head[f]=tot;}void find_scc(int u){    dfn[u]=low[u]=++dfs_clock;    s.push(u);    for(int i=head[u];i;i=nxt[i])    {        int v=to[i];        if(!dfn[v])        {            find_scc(v);            low[u]=min(low[u],low[v]);          }        else if(!scc[v])        {            low[u]=min(low[u],dfn[v]);        }    }    if(low[u]==dfn[u])    {        cnt++;        xh[cnt]=u;        while(1)        {            int x=s.top();            s.pop();            scc[x]=cnt;            minc[cnt]=min(minc[cnt],cost[x]);            xh[cnt]=min(xh[cnt],x);            if(x==u)            break;        }    }}int main(){    cin>>n>>p;    for(int i=1;i<=n;i++) cost[i]=INF;     for(int i=1;i<=p;i++)    {        int a,b;        cin>>a>>b;        cost[a]=b;    }    cin>>r;    for(int i=1;i<=r;i++)    {        cin>>ff[i]>>tt[i];        addedge(ff[i],tt[i]);    }    for(int i=1;i<=n;i++) minc[i]=INF;     for(int i=1;i<=n;i++)    {        if(!dfn[i])        find_scc(i);    }    for(int i=1;i<=r;i++)    {        if(scc[ff[i]]!=scc[tt[i]])        rd[scc[tt[i]]]++;    }    bool pd=1;    int noans=INF,yesans=0;    for(int i=1;i<=cnt;i++)    {        if(!rd[i])        {            if(minc[i]==INF)            {                pd=0;                noans=min(noans,xh[i]);            }            else yesans+=minc[i];        }    }    if(pd)    {        cout<<"YES"<<endl;        cout<<yesans;    }    else    {        cout<<"NO"<<endl;        cout<<noans;    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 xp系统电脑开机密码忘记了怎么办 华为荣耀9用久了卡怎么办 华为p9相机模糊敲打就正常怎么办 华为p9蓝频按什么都没反映怎么办 华为手机p9开机密码忘了怎么办 华为P9手机开机一直闪屏怎么办 荣耀畅玩7x用户数据锁定怎么办 华为手机p9的指纹解锁坏了怎么办 华为P9青春版外放音量小怎么办 华为麦芒5的开关键失灵怎么办 小米手机进水黑屏但是有声音怎么办 小米5手机突然黑屏没电怎么办 小米4开不了机怎么办充电没反应 小米手机充电没反应开不了机怎么办 红米note手机开不了机怎么办 红米手机突然黑屏开不了机怎么办 红米2a开不开机怎么办 红米4手开不了机怎么办 红米4a开不了机怎么办 魅族手机拨打电话时黑屏怎么办 金立手机拨打电话时黑屏怎么办 红米手机刷机黑屏了怎么办 酷派手机开机黑屏但能嗡嗡响怎么办 酷派手机忘记锁屏密码怎么办 酷派手机锁屏密码忘了怎么办 酷派手机不停的开机关机怎么办 苹果6手机进水了开不了机怎么办 金立手机突然黑屏开不了机怎么办 丢失手机又忘了ID锁怎么办? 小米2按出电话后黑屏怎么办 华为手机桌面拨号键没有了怎么办 华为荣耀5x黑屏后无法关机怎么办 华为手机突然黑屏电池充不了怎么办 华为手机恢复出厂设置后黑屏怎么办 华为荣耀畅玩6a内存不够怎么办 红米note4玩王者荣耀卡怎么办 华为荣耀5a手机被锁怎么办 华为荣耀v8应用锁忘记蜜码怎么办 阿里巴巴一键代销被投诉受假怎么办 登录小米云服务怎么删除密码怎么办 苹果6云空间连接不上怎么办