题目描述见下列网址

http://www.tyvj.cn/  (P1153)

经过对题目的分析,可以得出,题目的要求就是求出图中的强连通分量连,然后进行缩点操作,最后枚举每一个入度为0的点,如果可以有间谍的话,将贿赂所消耗的钱累加,否则的话记录下入度为0的点中最小点的标号。

分析:

1.对强连通分量的求解使用TARJAN算发(因为数据量太大,3000,如果直接使用DFS的话为n^2+M,可能会超时)。

2.在进行强连通分量缩点操作时,顺便记录缩成的点中贿赂间谍消耗的最小值,赋成这个点的权值。

3.对缩成的点进行入度的处理,即循环每一个强连通分量中的点,如果同一个强连通分量的点之间存在边,则子节点的入度减1。

最后枚举强连通分量中的点,只要存在一个点的入度大于0,则缩成的点的入度就大于0。

4.最后就是用模拟链表存储边时,数组不可以开的太小。(本人就因为这个原因悲剧了两次)。

5.ps.同样重要的是,C++中千万不要使用流读入,因为流的兼容性太强,速度奇慢,换标准输出(据统计标准读入是所有读入方法(readln,cin....)中

最快的)

下面附上C++代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
struct
{int x,y,n;
}e[100001];
int f[3001];
int o;
bool v[3001];
bool vs[1001];
int b[3001][3001],dfn[3001],low[3001],zhan=0,lian,ti=0;
int stick[3001],money[3001];
int into[3001];
bool map[3001][3001];
int intot[3001];
int min(int a,int b)
{return (a<b)?a:b;
}
void add(int a,int b)
{o++;e[o].x=a;e[o].y=b;e[o].n=f[a];f[a]=o;
}
void tanzhan(int u)
{lian++;int j=1;while (stick[zhan]!=u){b[lian][j++]=stick[zhan--];vs[stick[zhan]]=false;}b[lian][j++]=stick[zhan--];vs[u]=false;b[lian][0]=j-1;
}
void tarjan(int u)
{dfn[u]=++ti;if (low[u]==0) low[u]=dfn[u];stick[++zhan]=u;vs[u]=true;int t=f[u];v[u]=true;while (e[t].y!=0){if (v[e[t].y]==false) { tarjan(e[t].y);low[u]=min(low[u],low[e[t].y]);}else{if (vs[e[t].y]==true)low[u]=min(low[u],dfn[e[t].y]);}     t=e[t].n;           }if (dfn[u]==low[u]) tanzhan(u);
}
int main()
{freopen("tarjan.in","r",stdin);freopen("tarjan.out","w",stdout);int n;memset(map,0,sizeof(map));scanf("%d",&n);int p;scanf("%d",&p);for (int i=1;i<=p;i++){int a,b;scanf("%d%d",&a,&b);if (money[a]==0||b<money[a])money[a]=b;}int r;scanf("%d",&r);for (int i=1;i<=r;i++){int a,b;scanf("%d%d",&a,&b);add(a,b);into[b]++;map[a][b]=1;}for (int i=1;i<=n;i++)if (v[i]==false) tarjan(i);for (int i=1;i<=lian;i++){intot[i]=0;for (int j=1;j<=b[i][0];j++)for (int k=1;k<=b[i][0];k++)if (k!=j){if (map[b[i][j]][b[i][k]]==1) into[b[i][k]]--;}for (int j=1;j<=b[i][0];j++)if (into[b[i][j]]>0) intot[i]=1;}int sum=0;int cant=100000000;for (int i=1;i<=lian;i++){if (intot[i]==0){int maxx=100000000;for (int j=1;j<=b[i][0];j++)if (money[b[i][j]]!=0&&money[b[i][j]]<maxx) maxx=money[b[i][j]];if (maxx==100000000){  for (int j=1;j<=b[i][0];j++)if (b[i][j]<cant) cant=b[i][j];}else if (maxx!=100000000) sum+=maxx;}}if (cant==100000000){printf("YES\n");printf("%d\n",sum);}else{printf("NO\n");        printf("%d\n",cant);}return 0;
}

本文地址:http://www.cnblogs.com/foreverzsz/archive/2010/11/07/1870968.html

(foreverzsz原创,转载请注明出处)

转载于:https://www.cnblogs.com/foreverzsz/archive/2010/11/07/1870968.html

tyvj间谍网络(强连通分量)题解相关推荐

  1. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  2. P1262 间谍网络 (Tarjan 求强连通分量)

    题目传送门:https://www.luogu.com.cn/problem/P1262 题意 题意转换成图的角度理解,给出初始可以访问的节点 D i D_i Di​ 以及访问这些节点需要的代价 W ...

  3. 洛谷P1262 间谍网络题解

    洛谷P1262 间谍网络题解 题目大意 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B.有些间谍收受贿赂,只要 ...

  4. nyist120 校园网络 (Tarjan算法 / 强连通分量)

    校园网络(nyist 120) 解题思路请看代码块中的注释~ import java.util.Scanner; import java.util.Stack; import java.util.Ve ...

  5. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  6. P1262 间谍网络

    传送门 思路: ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量. ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿. inline void dfs(int u) ...

  7. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  8. 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767

    poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图  任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...

  9. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

最新文章

  1. Windows如何打包Qt程序
  2. 学习Kotlin(三)类和接口
  3. Eclipse Neon 配置C/C++开发环境
  4. 《应用软件安全编程指南》国标发布 奇安信代码卫士已全面支持
  5. java实现梯度异步通知,BIO原理及代码实现
  6. 无人机——凤凰模拟器篇(四)图文安装教程(附软件下载)
  7. 如何撰写软件详细设计内容?
  8. 联想台式计算机编号怎么查,联想台式机主机编号怎么查询
  9. 为什么小孩会沉迷游戏?小孩沉迷游戏中不想上学怎么办
  10. 网络共享中心的计算机名,网络和共享中心在哪?教你打开Windows电脑系统网络和共享中心5大方法...
  11. 消防报警系统服务器,广东火灾报警UL真诚服务
  12. 机器学习之二十一(读书笔记)
  13. el-calendar 日历做排班、值班、打卡.......
  14. mysql bug frash_MySQL Flush导致的等待问题
  15. springboot+毕业设计管理系统 毕业设计-附源码221032
  16. 智慧路灯点亮新型城市
  17. 安全远程办公的十大技巧
  18. 物联网专业并不好_在广阔的物联网中,“智能”仍然并不意味着安全
  19. 当代偷车贼分两种,剪电线的和用智能设备的
  20. 外贸怎么在谷歌搜索客户?

热门文章

  1. 判断图片是否存在,不存在则显示默认图片
  2. 2020杭电多校训练(第一、二场)
  3. 什么是java swing_Java Swing简介:Swing是什么?
  4. 平板电脑应用_安卓工业平板电脑的应用优势
  5. 负载均衡(BLB)发布HTTPS监听器服务
  6. SqlSugar 3.实体配置
  7. 多媒体文件格式:TS 格式
  8. VS打开工程时提示:文件加载 使用Unicode (UTF-8)编码加载文件***时,有些字节已用Unicode替换字符替换。
  9. 当心!浏览网页也会中木马
  10. Python标准库之urllib,urllib2自定义Opener