清北学堂-贪心-bfs

输入样例:
3
5 10 5
4 10 8 1 10
1 3
1 4
1 5
1 3
2 1
2 5
4 3
4 3
4 5
5 1
1 4
4 6
1 9
4 7
2 9
5 10 5
2 8 8 10 10
2 1
2 3
3 2
3 4
3 1
3 2
3 4
4 1
5 4
5 1
1 4
2 3
4 7
3 10
1 5
5 10 5
9 9 8 2 1
1 5
1 5
2 1
2 4
2 4
2 4
3 2
3 1
4 3
4 3
5 9
3 9
2 7
5 1
5 4
输出样例:
40
60
90
70
90
8
30
70
100
10
9
81
63
1
4
数据范围:

思路:
让求和一个点联通的所有点的最大值
正解是tarjan,但是可以贪心,建反向边,从大到小排序一下,从最大的那个点宽搜,能扫到的更新他的值为起点的值(也就是这个点联通的最大值),把所有点更新后跳出,每次讯问时查询即可。。。。
注意标号在排序后会改变,另开个数组记录排序前每个标号对应的权值;
dfs bfs 都可以。。。。
多组询问,注意每次数组清零。。。
代码:
bfs:
#include<cstdio>
#include<bits/stdc++.h>
#define MAXN 1000000
using namespace std;
int cnt,head[MAXN],T,n,m,k,ans[MAXN],tot,num[MAXN],pos,cnt1[MAXN];
int val[MAXN];
bool v[MAXN];
struct node{int to,nxt;}e[MAXN<<1];
struct node2{int val,id;}ee[MAXN<<1];
void add(int from,int to)
{
e[++cnt].to=to;
e[cnt].nxt=head[from];
head[from]=cnt;
}
queue <int> q;
bool cmp(const node2 &a,const node2 &b) {return a.val>b.val;}
void bfs(int u)
{
q.push(u);
v[u]=1;
pos++;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x] ; i ; i=e[i].nxt)
{
int y=e[i].to;
if(!v[y])
{
pos++;
val[y]=val[u];
v[y]=1;
q.push(y);
}
}
}
}
void init()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&ee[i].val);
val[i]=ee[i].val;
ee[i].id=i;
}
sort(ee+1,ee+n+1,cmp);
for(int i=1;i<=n;i++)num[i]=ee[i].id;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
if(!v[num[i]])bfs(num[i]);
}
int a,u;
for(int i=1;i<=k;i++)
{
scanf("%d%d",&a,&u);
ans[++tot]=val[a]*u;
}
}
void clear()
{
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
memset(ee,0,sizeof(ee));
memset(v,0,sizeof(v));
memset(num,0,sizeof(num));
memset(val,0,sizeof(val));
}
int main()
{
#ifdef yilnr
#else
freopen("neural.in","r",stdin);
freopen("neural.out","w",stdout);
#endif
scanf("%d",&T);
while(T--)
{
init();
for(int i=1;i<=k;i++) printf("%d\n",ans[i]);
clear();
tot=0;pos=0;
}
fclose(stdin);fclose(stdout);
return 0;
}
dfs:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 400500
using namespace std; inline int read() {
int x = 0,f = 1;
char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
} int T,n,m,k;
int head[N],cnt;
struct node {
int nxt,to;
}e[N];
bool vis[N];
struct edge {
int num,id;
bool friend operator < (const edge &a,const edge &b) {
return a.num > b.num;
}
}tr[N];
long long sum[N]; inline void cp(int u,int v) {
cnt ++;
e[cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
} inline void dfs(int u,int top) {
vis[u] = 1;
for(int i = head[u]; i ; i = e[i].nxt) {
int v = e[i].to;
if(vis[v]) continue;
sum[v] = sum[top];
dfs(v,top);
}
} inline void Work() {
n = read(),m = read(),k = read();
for(int i = 1;i <= n;i ++) tr[i].num = read(),tr[i].id = i,sum[i] = tr[i].num;
for(int i = 1;i <= m;i ++) {
int a = read(),b = read();
cp(b,a);
}
sort(tr + 1,tr + n + 1);
for(int i = 1;i <= n;i ++)
if(!vis[tr[i].id]) dfs(tr[i].id,tr[i].id);
for(int i = 1;i <= k;i ++) {
int a = read(),b = read();
printf("%lld\n",sum[a] * b);
}
} inline void Clean() {
memset(sum,0,sizeof(sum));
memset(tr,0,sizeof(tr)); cnt = 0;
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
} int main() {
freopen("neural.in","r",stdin);
freopen("neural.out","w",stdout); T = read();
while(T --)
Work(),Clean();
return 0;
}
dfs来自清远学会
清北学堂-贪心-bfs的更多相关文章
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂4.28Day1(重大更新详见贪心例一)
枚举 用题目中给定的检验条件判定哪些是无用的,哪些是有用 的.能使命题成立的即为其解 . 例一 一棵苹果树上有n个苹果,每个苹果长在高度为Ai的地方.小明的身高为x 他想知道他最多能摘到多少苹果 数据 ...
- 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)
qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...
- 五一培训 清北学堂 DAY1
今天是冯哲老师的讲授~ 1.枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些是有用的.能使命题成立的即为其解. 例一一棵苹果树上有n ...
- <知识整理>2019清北学堂提高储备D1
一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...
随机推荐
- 对Python中print函数参数的认识
输出函数是最常用的,对print()参数的准确认识尤为重要. sep='':sep参数表示函数中不同value的分隔符,默认为一个空格. end='':end参数表示函数结尾的处理,默认换行. 例如: ...
- JS执行顺序问题
JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的.而且在分析执行同一段代码中,定义式的函数语句会被提取出来优先执行.函数定义执行完后,才会按顺序执行其他代码. 先看看 ...
- JS 验证字符串是否能转为json格式
var isJSON=function (str) { if (typeof str == 'string') { try { var obj = JSON.parse(str); if (typeo ...
- JS 控制特殊字符
1.标签上直接替换方法: JS 控制不能输入特殊字符 1 <input type="text"class="domain"onkeyup="th ...
- 使ffmpeg支持HDR10bit 环境为ubuntu16.04
1. 编译X265,生成静态库, 安装到默认目录 修改CMakeLists.txt 使 HIGH_BIT_DEPTH 设置为ON cmake -G "Unix Makefiles&qu ...
- python计算出现错误
用python计算39.8-0.1得出的结果是39.699999999999996 其他数字计算正确,唯独这个计算错误. 原因: 中文解释: https://docs.python.org/zh-cn ...
- PyInstaller使用教程
简介 PyInstaller是一个第三方库,它能够在Windows.Linux. Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Py ...
- MySQL时间类型及获取、展示处理
MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...
- 行级安全(Row
通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...
- win10 增加一个新磁盘
1.右键我的电脑,选择管理 可以看到C盘的空间相比较大,拿出来250G的空间做成E盘 2.选择OS(C:),右键,压缩卷,请稍后,点击压缩 3.此刻会看到,有一块黑色区域就是新建的未分配空间,这时我们 ...