洛谷传送门


看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍。

如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号。

如果全被标记,就输出YES,再从入度为0的缩点里找最小的价格,加到ans中,最后输出ans。

——代码

 #include <cstdio>
#include <stack>
#include <cstring> using namespace std; int n, p, r1, cnt, idx, ans = , minn;
int a[], next[], to[], head[], low[], dfn[], belong[], r[];
bool ins[], vis[], mey[];
stack <int> s; inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} void dfs(int u)
{
int i, v;
vis[u] = ;
mey[u] = ;
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(!vis[v]) dfs(v);
}
} void tarjan(int u)
{
low[u] = dfn[u] = ++idx;
s.push(u);
ins[u] = ;
int i, v;
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(ins[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u])
{
cnt++;
do
{
v = s.top();
s.pop();
ins[v] = ;
belong[v] = cnt;
}while(u != v);
}
} int main()
{
int i, j, k, x, y, u, v;
scanf("%d %d", &n, &p);
for(i = ; i <= p; i++)
{
scanf("%d", &x);
scanf("%d", &a[x]);
}
memset(head, -, sizeof(head));
scanf("%d", &r1);
for(i = ; i <= r1; i++)
{
scanf("%d %d", &x, &y);
add(x, y);
}
for(i = ; i <= n; i++)
if(!vis[i] && a[i])
dfs(i);
for(i = ; i <= n; i++)
if(!mey[i])
ans = min(ans, i);
if(ans != )
{
printf("NO\n%d", ans);
return ;
}
cnt = ;
for(i = ; i <= n; i++)
if(!dfn[i])
tarjan(i);
for(u = ; u <= n; u++)
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(belong[u] != belong[v]) r[belong[v]]++;
}
ans = ;
for(i = ; i <= cnt; i++)
if(r[i] == )
{
minn = ;
for(j = ; j <= n; j++)
if(belong[j] == i && a[j])
minn = min(minn, a[j]);
ans += minn;
}
printf("YES\n%d", ans);
return ;
}

间谍网络——tarjan求SCC的更多相关文章

  1. tyvj 1153 间谍网络 tarjan有向图强连通

    P1153 - 间谍网络 From ForeverBell    Normal (OI)总时限:13s    内存限制:128MB    代码长度限制:64KB 描述 Description 由于外国 ...

  2. poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27698   Accepted: 11148 De ...

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

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

  4. tarjan算法求scc & 缩点

    前置知识 图的遍历(dfs) 强连通&强连通分量 对于有向图G中的任意两个顶点u和v存在u->v的一条路径,同时也存在v->u的路径,我们则称这两个顶点强连通.以此类推,强连通分量 ...

  5. 间谍网络(tarjan缩点)

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

  6. 洛谷P1262 间谍网络[强连通分量 BFS]

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  7. tarjan 缩点 求 scc

    算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...

  8. Tarjan 求图点强联通,桥的应用

    在图中求双联通和强联通分量是我们解决非树结构的图连通问题的利器 通过求求图的双联通和强联通分量能把图转化成DAG进行求解: 行走 Description 给出一个有向图,你可以选择从任意点出发走到任意 ...

  9. TYVJ P1153 间谍网络

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

随机推荐

  1. js中字符串转换为数值的两种方法的区别

    在js中字符串转换为数值的方法有三种:转换函数,强制类型转换,隐式转换 1.转换函数 parseInt()   //将字符串转换为整型 parseFloat()  //将字符串转换为浮点型 转换函数在 ...

  2. 翻译:如何使用CSS实现多行文本的省略号显示

    本文翻译自CSS Ellipsis: How to Manage Multi-Line Ellipsis in Pure CSS,文中某些部分有些许改动,并添加译者的一些感想,请各位读者谅解. 合理的 ...

  3. mfc---CFileDialog的过滤器

    CFileDialog的过滤器每种类型由两部分组成“tda|*.tda”,两种类型之间用“|”隔开

  4. MySQL索引的使用方式

    一,create CREATE INDEX可对表增加普通索引或UNIQUE索引. CREATE INDEX index_name ON table_name (column_list) CREATE ...

  5. 关于label和input对齐的那些事

    input文本和label对齐 默认状态下,也就是下面这样, 文字和input是居中的. <div> <label>我是中国人</label> <input ...

  6. Android: Fragment (Trying to instantiate a class that is not a Fragment)

    Fragments API: https://developer.android.com/guide/components/fragments.html 第一次使用Fragment遇到一个问题就是: ...

  7. SQL_Join 小总结

    原文出自 :http://www.nowamagic.net/librarys/veda/detail/936 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多in ...

  8. wp8数据存储--独立存储文件 【转】

    出自 : http://www.cnblogs.com/MyBeN/p/3339019.html 文章篇幅有点大,建议去源网看看 1.调用手机的独立存储 例如:IsolatedStorageFile ...

  9. 关于ORACLE通过file_id与block_id定位数据库对象遇到的问题的一点思考

    在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object).例如,我们在10046生成的trace文件中file#=4 block ...

  10. final 、finally 和 finalize()的区别

    1. final 是一个关键字.可以修饰数据.方法.类. 1)final 数据:final 用来修饰一个永不改变的编译时常量,或者运行时初始化但是不希望被改变的常量.一个既是 static又是 fin ...