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. RichTextBox选中文本时往自己的其他的位置实现拖拽

          private void Form1_Load(object sender, EventArgs e) { richTextBox1.AllowDrop = true; richTextB ...

  2. fscanf函数

    函数定义: int fscanf( FILE *stream, const char *format [, argument ]... ); 以下是csdn的样例: /* FSCANF.C: This ...

  3. fork和exec函数

    #include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为- fork最困难之处在于调用它一次,它却返回两次.它在调 ...

  4. Android(java)学习笔记184:生成 4种 不同权限的文件

    1.首先我们编写一个生成 4种 不同权限的文件的程序案例: (1)首先是activity_main.xml文件: <RelativeLayout xmlns:android="http ...

  5. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  6. 使用html5兼容低版本浏览器

    因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...

  7. linux修改时区,时间格式

    修改为上海的时区: 查看当前时区 date cp -vf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime vim /etc/sysconfig/cl ...

  8. sql server抓取表结构的语句

    sql server 2008抓取方法: ---------------------------------------   SELECT      表名 = Case When A.colorder ...

  9. jquery 移除数组重复的元素----$.unique()

    举例说明: var  fruits=["apple","banana","pear","orange","ba ...

  10. 查看xcode的路径

    sudo /usr/libexec/locate.updatedb locate liblaunch_sim