题目:https://www.luogu.org/problemnew/show/P1262

首先,一个强连通分量里有一个点被控制则所有点都被控制,所以先 tarjan 缩点,记一下每个连通块中能被收买的人的最小价钱,和整个连通块的点的最小 id;

然后如果有入度为0的点不能被收买,则输出 NO,找最小 id 时注意要找它指向的所有点,又不包括中间可以被收买的;

否则就是 YES,花费就是入度为0的点的最小代价之和。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=,xm=,inf=0x3f3f3f3f;
int n,m,hd[xn],ct,to[xm],nxt[xm],fr[xm],dfn[xn],low[xn],tim,sta[xn],top;
int deg[xn],col[xn],cr,hd2[xn],ct2,to2[xm],nxt2[xm],p,w[xn],ans,mn[xn],mi[xn];
bool vis[xn];
void add(int x,int y){to[++ct]=y; fr[ct]=x; nxt[ct]=hd[x]; hd[x]=ct;}
void add2(int x,int y){to2[++ct2]=y; nxt2[ct2]=hd2[x]; hd2[x]=ct2;}
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void tarjan(int x)
{
dfn[x]=low[x]=++tim; vis[x]=; sta[++top]=x;
for(int i=hd[x],u;i;i=nxt[i])
{
if(!dfn[u=to[i]])tarjan(u),low[x]=min(low[x],low[u]);
else if(vis[u])low[x]=min(low[x],dfn[u]);
}
if(dfn[x]==low[x])
{
int y; cr++; mn[cr]=inf; mi[cr]=inf;
while((y=sta[top])!=x)
col[y]=cr,vis[y]=,top--,mn[cr]=min(mn[cr],w[y]),mi[cr]=min(mi[cr],y);
col[x]=cr; vis[x]=; top--;
mn[cr]=min(mn[cr],w[x]); mi[cr]=min(mi[cr],x);
}
}
int find(int x)
{
int ret=mi[x];
for(int i=hd2[x];i;i=nxt2[i])
{
if(mn[to2[i]]!=inf)break;//!
ret=min(ret,find(to2[i]));
}
return ret;
}
int main()
{
n=rd(); p=rd();
memset(w,0x3f,sizeof w);
for(int i=,id;i<=p;i++)id=rd(),w[id]=rd();
m=rd();
for(int i=,x,y;i<=m;i++)
{
x=rd(); y=rd();
add(x,y);
}
//add(x=rd(),y=rd()),printf("add(%d,%d)\n",x,y);
for(int i=;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=,u,v;i<=ct;i++)
if((u=col[fr[i]])!=(v=col[to[i]]))add2(u,v),deg[v]++;
bool fl=; int id=inf;
for(int i=;i<=cr;i++)
{
if(deg[i])continue;
if(mn[i]==inf)fl=,id=min(id,find(i));
else ans+=mn[i];
}
if(fl)printf("NO\n%d\n",id);
else printf("YES\n%d\n",ans);
return ;
}

最新文章

  1. lnmp安装
  2. 深入理解DOM事件类型系列第三篇——变动事件
  3. js获取当前日期
  4. Excel数据批量导入到数据库2
  5. djngo快速实现--使用Bootstrap
  6. osgi 命令
  7. 【原】现有市场上H264 IPCamerad的功能
  8. js控制html5 audio的暂停、播放、停止
  9. java调用shell脚本
  10. 微软TTS示例
  11. hello MemSQL 入门安装演示样例
  12. iOS开展 - 中国 iOS/Mac 开发博客列表
  13. mysql 数据表
  14. C#调用Oracle的存储过程时,连接字符串需要配置PLSQLRSet=1
  15. Docker命令详解(run篇)
  16. Java输入输出小结
  17. CString int转换
  18. 《转》python学习(4)对象
  19. saltstack源码详解一
  20. 【洛谷 UVA11417】 GCD(欧拉函数)

热门文章

  1. [luoguP2420] 让我们异或吧(dfs + 异或的性质)
  2. HDU 2352 Verdis Quo
  3. BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
  4. msp430入门编程30
  5. HDU 6370 dfs+并查集
  6. 一份关于webpack2和模块打包的新手指南(二)
  7. 定制 ArcEngine 要素编辑工具
  8. Hibernate中的自己定义类型——UserType、CompositeUserType
  9. webpack-Module Resolution(模块解析)
  10. POST &amp;amp; GET &amp;amp; Ajax 全解