洛谷传送门


看着这道题给人感觉就是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 ;
}

最新文章

  1. uva10344 23 out of 5
  2. Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别
  3. Android中获取应用程序(包)的信息----PackageManager
  4. FreeMarker语法
  5. Ubuntu下Qt-4.7.1的静态编译
  6. 有关Oracle cvu和cvuqdisk
  7. 【翻译】编译Cordova项目
  8. c printf()详解[转载]
  9. 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)
  10. C#码农的大数据之路 - 使用C#编写MR作业
  11. idea 方便的设置代码段
  12. leveldb 学习记录(一) skiplist
  13. 牛客多校第三场-A-PACM Team-多维背包的01变种
  14. 中文自然语言处理工具hanlp隐马角色标注详解
  15. NDK学习笔记(Add.cpp注释)(一)
  16. Java的学习02
  17. codeforces 475D
  18. 乘风破浪:LeetCode真题_024_Swap Nodes in Pairs
  19. ubuntu系统下安装pyspider:使用supervisord启动并管理pyspider进程配置及说明
  20. c++ 替换修改一个文件夹下的所有文件的文件名

热门文章

  1. re匹配语法-match、search和findall
  2. logging模块进阶2
  3. Dom 获取、Dom动态创建节点
  4. mysql5.7.25集群部署和方案设计(附PXC一键部署脚本)
  5. 如何配置TomCat
  6. RFS自动化测试(一)
  7. 解决python pip安装提示&quot;not a supported wheel on this platform&quot;
  8. Android接入支付宝和微信支付
  9. QT_2
  10. loadClass和forName 的区别