P1153 - 间谍网络

From ForeverBell    Normal (OI)
总时限:13s    内存限制:128MB    代码长度限制:64KB

描述 Description

由于外国间谍的大量渗入,国家安全正处于高度危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍接受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。 
我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握了哪些间谍的资料。假设总共有n个间谍(n不超过3000),每个间谍分别用1到3000的整数来标识。 
请根据这份资料,判断我们是否可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。

输入格式 InputFormat

一行只有一个整数n。 
第二行是整数p。表示愿意被收买的人数,1<=p<=n。 
接下来的p行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。这个数额不超过20000. 
紧跟着一行只有一个整数r,1<=r<=8000。然后r行,每行两个正整数,表示数对(A,B),A间谍掌握B间谍的证据。

输出格式 OutputFormat

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

样例输入 SampleInput [复制数据]

2
1
2 512
2
1 2
2 1

样例输出 SampleOutput [复制数据]

YES
512   一道很裸的tarjan题,但明显我的tarjan学了跟没学一样,很多小细节没有注意(更新low什么时候用dfn,什么时候用low;tarjan完了要把点从图中删除)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 10000
#define MAXE MAXN * 2
#define MAXV MAXN
#define INF 0x3f3f3f3f
int n,m;
struct Edge
{
int np;
Edge *next;
}E[MAXE],*V[MAXV];
int tope=-;
void addedge(int x,int y)
{
E[++tope].np=y;
E[tope].next=V[x];
V[x]=&E[tope];
}
int state[MAXN];
int value[MAXN];
int dfn[MAXN],low[MAXN],dfstime=;
int stack[MAXN],tops=-;
int color[MAXN],totc=;
void tarjan(int now)
{
low[now]=dfn[now]=++dfstime;
Edge *ne;
stack[++tops]=now;
for (ne=V[now];ne;ne=ne->next)
{
if (dfn[ne->np])//state[ne->np]==1
{
if (color[ne->np])continue;
low[now]=min(low[now],dfn[ne->np]);
}else
{
tarjan(ne->np);
low[now]=min(low[now],low[ne->np]);//易写反
}
}
if (low[now]==dfn[now])
{
totc++;
while (stack[tops]!=now)
{
color[stack[tops--]]=totc;
}
color[stack[tops--]]=totc;
}
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int t;
int x,y;
int i,j,k;
scanf("%d",&n);
memset(value,INF,sizeof(value));
scanf("%d",&t);
for (i=;i<t;i++)
{
scanf("%d%d",&x,&y);
value[x]=y;
}
scanf("%d",&m);
for (i=;i<m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
}
for (i=;i<=n;i++)
{
if (!dfn[i])
{
tarjan(i);
}
}
Edge *ne;
for (i=;i<=n;i++)
{
for (ne=V[i];ne;ne=ne->next)
{
if (color[ne->np]==color[i])continue;
state[color[ne->np]]=true;
}
}
x=INF;
bool ok=true;
int ans=;
int ans2=INF;
for (i=;i<=totc;i++)
{
if (state[i])continue;
x=INF;
for (j=;j<=n;j++)
{
if (color[j]!=i)continue;
x=min(x,value[j]);
}
if (x==INF)
{
ok=false;
for (j=;j<=n;j++)
{
if (color[j]==i)
{
ans2=min(ans2,j);
break;
}
}
}
ans+=x;
}
if (!ok)
{
printf("NO\n%d\n",ans2);
}else
{
printf("YES\n%d\n",ans);
}
}

v

tyvj 1153 间谍网络 tarjan有向图强连通的更多相关文章

  1. TYVJ P1153 间谍网络

    P1153 间谍网络 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 由于外国间谍的大量渗入,国家安全正处于高度危机之中.如果A间谍手中掌握着关于B间谍的犯罪 ...

  2. 间谍网络——tarjan求SCC

    洛谷传送门 看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍. 如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号. 如果全被 ...

  3. 洛谷 1262 间谍网络 Tarjan 图论

    洛谷 1262 图论 tarjan 并不感觉把这道题目放在图的遍历中很合适,虽然思路比较简单但是代码还是有点多的,, 将可收买的间谍的cost值设为它的价格,不可购买的设为inf,按照控制关系连图,T ...

  4. Tarjan求有向图强连通详解

    Tarjan求有向图强连通详解 注*该文章为转发,原文出处已经不得而知 :first-child { margin-top: 0; } blockquote > :last-child { ma ...

  5. 有向图强连通分量的Tarjan算法

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  6. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  7. 【转】有向图强连通分量的Tarjan算法

    原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

  8. 图的连通性:有向图强连通分量-Tarjan算法

    参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...

  9. 有向图强连通分量的Tarjan算法和Kosaraju算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

随机推荐

  1. JS获取和设置光标的位置

    <html> <head> <script language="javascript"> function getCursortPosition ...

  2. 从Swap函数谈加法溢出问题

    1.      初始题目 面试题:). 这个题目太经典,也太简单,有很多人都会不假思索结出答案: //Code 1 void Swap(int* a, int* b) { *a = *a + *b; ...

  3. Intra-cluster Replication in Apache Kafka--reference

    Kafka is a distributed publish-subscribe messaging system. It was originally developed at LinkedIn a ...

  4. ARCGIS获取图层下的要素信息及要素类转换为要素

    /// <summary> /// 得到需要的字段名和字段值 /// </summary> /// <param name="layer">&l ...

  5. java输入输出流小细节

    package System; public class Systemdemo { public static void main(String args[]){ demo1(); demo2(); ...

  6. SQL Server 游标

    结果集,结果集就是select查询之后返回的所有行数据的集合. 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行. 正常面向集合的思维方式是: 而 ...

  7. bootstap 滚动监听

    ---首先结合源代码介绍官网的说明 ---然后总结了使用滚动监听的几个步骤 ---最后给出一个简单的例子 ---关键的一点:整体有点零散和乱七八糟,辛苦你的思维和眼睛了,呵呵 ------------ ...

  8. 消息处理之EventBus ——使用篇

    以前的几篇文章简单的介绍了一下UI线程和子线程之间的线程通信利器Handler,以及顺便介绍了一下SyncTask和HeadlerThread.这里介绍另一线程通信利器EventBus. EventB ...

  9. UDP,TCP理解。

    UDP: 面向无连接, 每个数据大小限制在64K内 因为面向无连接,所以就是不可靠协议. 将数据和源和谜底封装到数据包当中,不需要建立连接.速度快(就像送快递一样,管你在不可以先到你门口) 用处:聊天 ...

  10. OPENQUERY

    SELECT * FROM OPENQUERY(saql007,' SELECT  col1,col2,col3 FROM dbname.shemaname.tablename WHERE  (1=1 ...