zoukankan      html  css  js  c++  java
  • 洛谷 P1262 间谍网络

    题目描述

    由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果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
    屠龙宝刀点击就送
    #include <algorithm>
    #include <cstdio>
    #define N 5000 
    
    using namespace std;
    struct Edge
    {
        int to;
        Edge *next;
    }*head[N],edge[N<<1];
    struct Buy
    {
        int num,cost;
        bool operator<(Buy a)const
        {
            return cost<a.cost;
        }
    }pe[N];
    int r,ans,cnt,n,p,f[N],num[N];
    inline void ins(int u,int v)
    {
        edge[++cnt].next=head[u];
        edge[cnt].to=v;
        head[u]=cnt+edge;
    }
    void dfs(int now,int s)
    {
        if(f[now]) num[f[now]]--;
        f[now]=s,num[s]++;
        for(Edge *u=head[now];u;u=u->next)
        if(f[u->to]!=s) dfs(u->to,s);
    }
    int main()
    {
        scanf("%d",&n);
        scanf("%d",&p);
        for(int i=1;i<=p;i++) scanf("%d%d",&pe[i].num,&pe[i].cost);
        sort(pe+1,pe+1+p);
        scanf("%d",&r);
        for(int x,y;r--;)
        {
            scanf("%d%d",&x,&y);
            ins(x,y);
        }
        for(int i=1;i<=n;i++)
        {
            if(f[pe[i].num])
            {
                for(Edge *u=head[pe[i].num];u;u=u->next)
                {
                    int v=u->to;
                    if(!f[v])
                    {
                        dfs(pe[i].num,i);
                        break;
                    }
                }
            }
            else dfs(pe[i].num,i);
        }
        for(int i=1;i<=n;i++) if(!f[i]) {printf("NO
    %d
    ",i);return 0;}
        for(int i=1;i<=p;i++) if(num[i]) ans+=pe[i].cost;
        printf("YES
    %d
    ",ans);
        return 0;
    }
    
    
    
     
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    java把集合数据写入txt文档
    eclipse 启动报内存溢出的问题out of memory!
    面向对象基础知识整理
    在不同环境下MD5加密相同字符串,密文不一样的问题
    氮化镓选型
    碳化硅选型
    DSP选型
    FPGA选型
    MCU选型
    正点原子
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7391041.html
Copyright © 2011-2022 走看看