输入样例:

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. WMIC命令的利用技巧

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持.在WMIC出现之前,如果要管理WM ...

  2. Java 8 Collectors 类的静态工厂方法

    摘自<<Java 8 实战>> Collectors 类的静态工厂方法 工厂方法 返回类型 用于 toList List<T>  把流中所有项目收集到一个 List ...

  3. Typeof() 和 GetType()区别

    1.typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称. 2.GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof() ...

  4. makemigrations和migrate到底干了什么以及如何查询原生的sql语句

    在你改动了 model.py的内容之后执行下面的命令: python manger.py makemigrations 相当于 在该app下建立 migrations目录,并记录下你所有的关于mode ...

  5. VisualSVN Server 安装

    1.去官网下载:https://www.visualsvn.com/server/download/ 2.安装: 修改为后:  3.开机自动启动.

  6. vue关于路由容易忽略的点

    1.去掉导航里的# 在router.js中 export default new Router{ mode:'history' } 2.指定激活项的class 在router.js中 export d ...

  7. JavaScript 的基本使用

    JavaScript 基本语法要求: 1.JS的写法是严格区分大小写的. 2.标识符的起名要求跟java的是一样的,第一个位置可以说字母.下划线.美元符号.其他位置可以字母.下划线.美元符号.数字. ...

  8. Django ORM常用的字段和参数

    ORM 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类 ...

  9. 解决故障码400,“”The plain HTTP request was sent to HTTPS port“”

    Nginx HTTP服务器的报错"400 Bad Request: The plain HTTP request was sent to HTTPS port",本文将讲解如何解决 ...

  10. 04_ Flume采集文件到HDFS案例

    采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs 根据需求,首先定义以下3大要素 采集源,即source——监控文件内容更新 :  ex ...