输入样例:

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的更多相关文章

  1. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  2. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  3. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  4. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  5. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  6. 清北学堂4.28Day1(重大更新详见贪心例一)

    枚举 用题目中给定的检验条件判定哪些是无用的,哪些是有用 的.能使命题成立的即为其解 . 例一 一棵苹果树上有n个苹果,每个苹果长在高度为Ai的地方.小明的身高为x 他想知道他最多能摘到多少苹果 数据 ...

  7. 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)

    qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...

  8. 五一培训 清北学堂 DAY1

    今天是冯哲老师的讲授~ 1.枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些是有用的.能使命题成立的即为其解. 例一一棵苹果树上有n ...

  9. <知识整理>2019清北学堂提高储备D1

    一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...

随机推荐

  1. xpath的一些常用使用

    xml文档<html> <head> <title>My page</title> </head> <body> <h2& ...

  2. PostgreSQL-存储过程

    存储过程其实就是函数,由一组 sql 语句组成,实现比较复杂的数据库操作: 存储过程 是 存储在 数据库服务器 上的,用户可以像调用 sql 自带函数一样 调用存储过程 语法解析 CREATE [OR ...

  3. 牛客 128A 礼物 (组合计数)

    大意: n种一元的奥利奥, m种2元的奥利奥, 求花恰好k元钱购买奥利奥的方案数. 可重组合问题, 直接dp即可. #include <iostream> #include <sst ...

  4. hdu 3549 初试最大流问题

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  5. react 管理平台

    https://open.vbill.cn/react-admin/ 开源中国:https://gitee.com/sxfad/react-admin.git GitHub:https://githu ...

  6. mysql authentication plugin 'caching_sha2_password'

    解决办法: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root1';

  7. python小知识- webbrowser模块 + join()方法

    一.join描述 将序列中的元素以指定的字符连接生成一个新的字符串. 语法 语法: ‘sep’.join(seq) 参数说明: sep:分隔符.可以为空 seq:要连接的元素序列.字符串.元组.字典 ...

  8. Python: NumPy, Pandas学习资料

    NumPy 学习资料 书籍 NumPy Cookbook_[Idris2012] NumPy Beginner's Guide,3rd_[Idris2015] Python数据分析基础教程:NumPy ...

  9. go语言入门(8)异常处理

    1,error接口 Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下: type error interface { Error() strin ...

  10. 使用JS和PHP导出table表格

    把table表格的内容导出成excel 或者word等格式(简单容易不需要太多php) 导出需注意 1. 样式都在行间,导出excel表格会继承样式包括colspan.rowspan,非表格元素,样式 ...