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

    https://www.luogu.org/problem/show?pid=1262

    题目描述

    由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果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


    可以先根据间谍关系,然后将能互相指正的人搞到同一个强连通里,
    更新出得到收买这群间谍的最小代价,
    最后将入度是0的强连通的最小代价统计起来,这样就能收买所有间谍了。
    zz如我,更新最小值WA好多次。。
     1 #include <cstdio>
     2 
     3 const int INF(0x3f3f3f3f);
     4 const int N(3626);
     5 const int M(8626);
     6 int ans,money[N];
     7 int head[N],sumedge;
     8 struct Edge {
     9     int v,next;
    10     inline Edge(int v=0,int next=0):v(v),next(next){}
    11 }edge[M];
    12 inline void ins(int u,int v)
    13 {
    14     edge[++sumedge]=Edge(v,head[u]);
    15     head[u]=sumedge;
    16 }
    17 
    18 inline void read(int &x)
    19 {
    20     x=0; register char ch=getchar();
    21     for(; ch>'9'||ch<'0'; ) ch=getchar();
    22     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    23 }
    24 
    25 #define min(a,b) (a<b?a:b)
    26 
    27 int tim,low[N],dfn[N];
    28 int top,Stack[N],instack[N];
    29 int sumcol,col[N],cmoney[N],rd[N];
    30 void DFS(int u)
    31 {
    32     low[u]=dfn[u]=++tim;
    33     Stack[++top]=u; instack[u]=1;
    34     for(int v,i=head[u]; i; i=edge[i].next)
    35     {
    36         v=edge[i].v;
    37         if(!dfn[v]) DFS(v), low[u]=min(low[u],low[v]);
    38         else if(instack[v]) low[u]=min(low[u],dfn[v]);
    39     }
    40     if(dfn[u]==low[u])
    41     {
    42         col[u]=++sumcol;
    43         for(; Stack[top]!=u; --top)
    44         {
    45             col[Stack[top]]=sumcol;
    46             instack[Stack[top]]=false;
    47         }
    48         top--; instack[u]=false;
    49     }
    50 }
    51 
    52 int Aptal()
    53 {
    54 //    freopen("spyweb.in","r",stdin);
    55 //    freopen("spyweb.out","w",stdout);
    56     
    57     int n,m,p; read(n); read(p);
    58     for(int i=1; i<=n; ++i) money[i]=INF;
    59     for(int x,y,i=1; i<=p; ++i)
    60         read(x),read(y),money[x]=y;
    61     read(m); 
    62     for(int u,v; m--; )
    63         read(u),read(v),ins(u,v);
    64     for(int i=1; i<=n; ++i)
    65         if(!dfn[i]&&money[i]!=INF) DFS(i);
    66     for(int i=1; i<=n; ++i)
    67         if(!dfn[i])
    68         {
    69             printf("NO
    %d",i);
    70             return 0;
    71         }
    72     for(int i=1; i<=sumcol; ++i) cmoney[i]=INF;
    73     for(int v,u=1; u<=n; ++u)
    74         for(int i=head[u]; i; i=edge[i].next)
    75         {
    76             v=edge[i].v;
    77             if(col[u]!=col[v]) rd[col[v]]++;
    78         }
    79     for(int i=1; i<=n; ++i)
    80         cmoney[col[i]]=min(cmoney[col[i]],money[i]);
    81     for(int i=1; i<=sumcol; ++i)
    82         if(!rd[i]) ans+=cmoney[i];
    83     printf("YES
    %d",ans);
    84     return 0;
    85 }
    86 
    87 int Hope=Aptal();
    88 int main(){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    MySQL5.7安装教程(压缩版)
    ASP.Net 添加 Interop for Word, excel 插件
    OpenLayers-加载地图数据(Google Map)
    OpenLayers学习方法
    OpenLayers 项目分析——(二)源代码总体结构分析{感谢原作者对于大家的贡献!}
    OpenLayers项目分析——(一)项目介绍{感谢原作者为大家的贡献!}
    OpenLayers 项目分析——(三)BaseTypes {感谢原文作者对于大家的贡献!!!}
    GeoServer安装及配置过程(配置shapefile)
    如何查询postgreSQL 里面某个数据库中所有用户定义的数据表的名字
    WebGIS(PostgreSQL+GeoServer+OpenLayers)之三 OpenLayers客户端数据显示
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7495797.html
Copyright © 2011-2022 走看看