洛谷P1262间谍网络

tarjan+DAG板题

我们发现,如果一些人通过一些关系,组成了环,那么只需要收买环中花费最小的人即可得到整个环,所以我们用tarjan缩点,然后重新构图,每一个 强连通分量的花费是他当中能被收买的花费的最小值 ,然后我们得到了一张有向无环图,怎么判断是不是能被收买呢 ?我们构建新图时,将每个点的入度记录,若一个点的入度为0,但他没有被收买的最小权值 ,那么它这个间谍一定不会被收买,因为没有点指向他,能收买的话,直接累加入度为零的点的花费就好

代码

//By AcerMo
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int M=10000;
stacks;
vectorv[M];
vectorG[M];
int f[M],in[M];
int n,m,e,c[M];
int ind=0,ti=0,fa[M];
int dfn[M],low[M],vis[M];
void tarjan(int x)
{
	dfn[x]=low[x]=++ind;s.push(x);vis[x]=1;
	for (int i=0;iq;int ans=0;
	for (int i=1;i<=ti;i++)
	{
		if (!in[i]) 
		{
			if (f[i]!=1e9) q.push(i),ans+=f[i];
			else 
			{
				puts("NO");for (int k=1;k<=n;k++)
				if (fa[k]==i) return (void)(cout<

你可能感兴趣的:(图论-Tarjan)