首页 > 其他分享 >抓间谍(强连通)

抓间谍(强连通)

时间:2024-07-18 19:51:33浏览次数:12  
标签:输出 连通 int 整数 收买 间谍 第二行

https://www.luogu.com.cn/problem/P1262 第5题     抓间谍 查看测评数据信息

由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B。有些间

谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍

网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。

我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌

握了哪些间谍的资料。假设总共有 n 个间谍(n 不超过 3000),每个间谍分别用 1 到 3000 的整数来标识。

 

请根据这份资料,判断我们是否有可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。

输入格式

 

第一行只有一个整数 n。

第二行是整数 p。表示愿意被收买的人数,1<=p<= n。

接下来的 p 行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。这个数额不超过 20000。

紧跟着一行只有一个整数 r,1<= r<=8000。然后 r 行,每行两个正整数,表示数对 (A, B),A 间谍掌握 B 间谍的证据。

 

输出格式

 

如果可以控制所有间谍,第一行输出 `YES`,并在第二行输出所需要支付的贿金最小值。否则输出 `NO`,并在第二行输出不能控制的间谍中,编号最小的间谍编号。

 

输入/输出例子1

输入:

3

2

1 10

2 100

2

1 3

2 3

 

输出:

YES

110

 

样例解释

 

 

缩点
1.有环:环中间谍贿赂最小值
2.入度为0:必须贿赂
无法贿赂:“NO”

 

#include <bits/stdc++.h>
using namespace std;
const int N=160005, MAX=1e9+5;

int n, m, p, u1, v1, x, money, t[N];
int dfn[N], low[N], idx=0, cnt=0, id[N], rd[N], Minid[N], Minmo[N], Aans=0, Bans;
stack<int> st;
vector<int> a[N];
void dfs(int u)
{
	dfn[u]=low[u]=++idx;
	st.push(u);
	
	for (int i=0; i<a[u].size(); i++)
	{
		int v=a[u][i];
		if (!dfn[v])
		{
			dfs(v);
			low[u]=min(low[u], low[v]);
		}
		else if (!id[v]) low[u]=min(low[u], dfn[v]);
	}
	
	if (dfn[u]==low[u])
	{
		cnt++;
		while (st.top()!=u)
		{
			id[st.top()]=cnt;
			Minmo[cnt]=min(Minmo[cnt], t[st.top()]);
			Minid[cnt]=min(Minid[cnt], st.top());
			st.pop();
		}
		id[st.top()]=cnt;
		Minmo[cnt]=min(Minmo[cnt], t[st.top()]);
		Minid[cnt]=min(Minid[cnt], st.top());
		st.pop();
	}
}
int main()
{
	for (int i=0; i<N-5; i++) t[i]=Minid[i]=Minmo[i]=MAX;
	
	scanf("%d%d", &n, &p);
	for (int i=1; i<=p; i++)
	{
		scanf("%d%d", &x, &money);
		t[x]=money;
	}
	scanf("%d", &m);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d", &u1, &v1);
		a[u1].push_back(v1);
	}
	
	for (int i=1; i<=n; i++)
		if (!dfn[i] && t[i]!=MAX) dfs(i);
	
	for (int i=1; i<=n; i++)
		if (!dfn[i])
		{
			printf("NO\n%d", i);
			return 0;
		}
	
	for (int u=1; u<=n; u++)
		for (int j=0; j<a[u].size(); j++)
		{
			int v=a[u][j];
			if (id[u]!=id[v]) rd[id[v]]++;
		}
	
	for (int i=1; i<=cnt; i++)
	{
		if (rd[i]!=0) continue;
		Bans+=Minmo[i];
	} 
	
	printf("YES\n%d", Bans);
	return 0;
}

  

 

标签:输出,连通,int,整数,收买,间谍,第二行
From: https://www.cnblogs.com/didiao233/p/18310312

相关文章

  • 点对(强连通)
    https://www.luogu.com.cn/problem/P4306第2题   点对 查看测评数据信息给定一个N个节点的有向图,统计该有向图的点对个数,如下图:顶点1可达1,2,3,4,5顶点2可达2,3,4,5顶点3可达3,4,5顶点4,5都只能到达自身。所以这张图的点对数为14.给定一张图,请你求出它的点对数对......
  • 遍历(强连通)
    https://www.luogu.com.cn/problem/P2194第3题   遍历 查看测评数据信息给定n个点,m条边的有向图,每个节点有一个权重v(i),你的任务是把n个点遍历一遍,点可以重复经过。允许的操作如下:每次你可以选择一个开始节点i,如果可以从i出发,最后可以回到i节点,那么你的花费为v(i)。问:最......
  • 朋友(强连通)
    https://www.luogu.com.cn/problem/P1407 第1题   朋友 查看测评数据信息我们已知n对男女朋友,称第i对朋友的男方为B(i),女方为G(i)。若某男B(i)与某女G(j)曾经是同学(无论是大学,高中,亦或是幼儿园阶段,i<=j),则当某方与其朋友(即B(i)与G(i)或B(j)与G(j))感情......
  • 连通性相关
    连通性相关强连通分量强连通分量(SCC):极大的强连通子图。Tarjan算法维护一个栈存储搜索到的还未确定强连通分量的点,定义:\(dfn_u\):节点\(u\)被搜索的次序。\(low_u\):\(u\)子树中能回溯到的最小的\(dfn\)。不难得到:一个点子树内的\(dfn\)大于该点的\(dfn\)。......
  • 图论连通性
    【学习笔记】图论连通性啊啊啊啊啊!先引用一篇犇的:)))缩点弱连通:对于有向图中两点\(x\)和\(y\),它们在所有边为无向时存在一个环使它们相连。强连通:对于有向图中两点\(x\)和\(y\),存在一个环使它们相连。强连通子图:对于有向图\(G=(V,E)\),如果对于一个\(V\)的子集......
  • 无向图的连通性(割点与割边)
    割点与割边 割点的求解方法  割点详解 板题:https://www.luogu.com.cn/problem/P3388  第1题   割点 查看测评数据信息给出一个n个点,m条边的无向图,求图的割点。输入格式 第一行输入两个正整数n,m。下面m行每行输入两个正整数x,y表示x到y有一......
  • 动态图连通性笔记
    首先离线的话有几种方法:线段树分治动态维护最大生成树:边的权值为他的(下一次)删除时间,加边正常做,询问时问路径最小值是否小于当前时刻.动态图连通性Holm-deLichtenberg-Thorup(HLT)暴力:维护生成森林,若删树边则暴力找另一条边能替代这条树边.思想:给每条边赋一个“不重......
  • 数据融合工具(6)线要素网络连通性分组计算
            出行,一直在使用导航辅助我们从起点奔赴终点,或许我们会有过这样的思考?导航路线规划是怎么实现的?        ……        我们先掰扯掰扯……一、导航路线规划是如何实现的?        导航路线规划是一种复杂的算法和技术,它用于确定......
  • P1262 间谍网络 题解
    题目描述给你一个有向图,可以付出代价获取一些指定的点。在获取之后要求能以获取的点为出发点,将整个图都访问到,求最小的代价。思路既然需要令总的代价最少,那么如果通过买一个点就可以访问到的所有点,自然会比买两个点的方案更优。于是自然的就可以联想到可以将图划分成很多个强......
  • 信息学奥赛初赛天天练-43-CSP-J2020基础题-链表、连通图、2进制转10进制、栈、队列、
    PDF文档公众号回复关键字:202407102020CSP-J选择题单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)7.链表不具有的特点是()A.可随机访问任一元素B.不必事先估计存储空间C.插入删除不需要移动元素D.所需空间与线性表长度成正比8.有10个顶点的无向图至少......